C++错误:成员声明末尾的预期“;”

C++ error:expected ‘;’ at end of member declaration

本文关键字:错误 成员 声明 C++      更新时间:2023-10-16
#include <map>
#include <memory>
#include <iostream>
using namespace std;
class test
{
public:
    test(){}
    ~test(){}
    enum type
    {
        error = 0
    };
private:
    shared_ptr<map<int, type>> member_ = make_shared<map<int, type>>();//build error
    //shared_ptr<map<type, int>> member_ = make_shared<map<type, int>>();//build ok
};
int main()
{
    return 0;
}

当我用"shared_ptr<map<int, type>> member_ = make_shared<map<int, type>>()"编译程序时

main.cpp:17:63: error: expected ‘;’ at end of member declaration
     shared_ptr<map<int, type>> member_ = make_shared<map<int, type>>();
                                                               ^
main.cpp:17:67: error: expected unqualified-id before ‘>>’ token
     shared_ptr<map<int, type>> member_ = make_shared<map<int, type>>();
                                                                   ^
main.cpp:17:58: error: wrong number of template arguments (1, should be at least 2)
     shared_ptr<map<int, type>> member_ = make_shared<map<int, type>>();
                                                          ^
In file included from /usr/include/c++/5/map:61:0,
                 from main.cpp:1:
/usr/include/c++/5/bits/stl_map.h:96:11: note: provided for ‘template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map’
     class map
           ^
main.cpp:17:42: error: parse error in template argument list
     shared_ptr<map<int, type>> member_ = make_shared<map<int, type>>();
                                          ^
main.cpp:17:42: error: cannot resolve overloaded function ‘make_shared’ based on conversion to type ‘std::shared_ptr<std::map<int, test::type> >’

已经尝试过使用在线C++编译器编写代码,使用C++C++11C++14兼容的编译器时遇到相同的错误,但使用兼容的编译器编译得很好C++17这意味着您的代码在C++17之前C++标准中是不合法的。然而,正如其他人所指出的,即使使用C++11C++14标准,该代码在其他在线编译器站点上也能很好地编译。所以我猜这些错误是由于编译器支持/不支持的功能造成的。

好吧,无论如何你都不应该像这样初始化类成员。类成员的初始化应该在类构造函数中进行,如下所示:

#include <map>
#include <memory>
#include <iostream>
using namespace std;
class test
{
public:
    test() { member_ = make_shared<map<int, type>>(); }
    ~test() { }
    enum type
    {
        error = 0
    };
private:
    shared_ptr<map<int, type>> member_;
};
int main()
{
    return 0;
}

即使在在线C++编译器中,这也编译得很好,这是我们设法重现问题的唯一地方。