C ++错误:成员声明结尾出现“;”

时间:2019-01-18 03:15:57

标签: c++

#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> >’

2 个答案:

答案 0 :(得分:1)

已使用Online C++ Compiler尝试过您的代码,使用C++C++11C++14兼容的编译器也遇到了相同的错误,但是使用C++17进行了很好的编译兼容的编译器。 这意味着在C++17 之前,您的代码在C ++标准中不合法。正如其他人指出的那样,即使使用C++11C++14标准,该代码也可以在其他联机编译器站点上很好地编译。因此,我猜这些错误是由于编译器受支持/不受支持的功能造成的。

答案 1 :(得分:1)

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

#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;
}

即使在Online C++ Compiler(这是我们设法重现该问题的唯一位置)中,此编译也很好。