#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> >’
答案 0 :(得分:1)
已使用Online C++ Compiler尝试过您的代码,使用C++
,C++11
和C++14
兼容的编译器也遇到了相同的错误,但是使用C++17
进行了很好的编译兼容的编译器。 这意味着在之前,您的代码在C ++标准中不合法。正如其他人指出的那样,即使使用C++17
C++11
和C++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(这是我们设法重现该问题的唯一位置)中,此编译也很好。