C++ C++;错误:应为‘’;在成员声明末尾 #包括 #包括 #包括 使用名称空间std; 课堂测试 { 公众: test(){} ~test(){} 枚举类型 { 错误=0 }; 私人: 共享的\u ptr成员\uu=make\u shared();//生成错误 //共享的\u ptr成员\uu=make\u shared();//生成确定 }; int main() { 返回0; }

C++ C++;错误:应为‘’;在成员声明末尾 #包括 #包括 #包括 使用名称空间std; 课堂测试 { 公众: test(){} ~test(){} 枚举类型 { 错误=0 }; 私人: 共享的\u ptr成员\uu=make\u shared();//生成错误 //共享的\u ptr成员\uu=make\u shared();//生成确定 }; int main() { 返回0; },c++,C++,当我用“shared\u ptr member\uu=make\u shared()” main.cpp:17:63:错误:应为“;”在成员声明末尾 共享的_ptr成员_uu=使_共享(); ^ main.cpp:17:67:错误:在“>>”标记之前应为非限定id 共享的_ptr成员_uu=使_共享(); ^ main.cpp:17:58:错误:模板参数的数量错误(1,应至少为2) 共享的_ptr成员_uu=使_共享(); ^ 在/usr/include/c++/5/map:61:0中包含的文件

当我用
“shared\u ptr member\uu=make\u shared()”

main.cpp:17:63:错误:应为“;”在成员声明末尾
共享的_ptr成员_uu=使_共享();
^
main.cpp:17:67:错误:在“>>”标记之前应为非限定id
共享的_ptr成员_uu=使_共享();
^
main.cpp:17:58:错误:模板参数的数量错误(1,应至少为2)
共享的_ptr成员_uu=使_共享();
^
在/usr/include/c++/5/map:61:0中包含的文件中,
来自main.cpp:1:
/usr/include/c++/5/bits/stl_map.h:96:11:注意:为“模板类std::map”提供
类图
^
main.cpp:17:42:错误:模板参数列表中的分析错误
共享的_ptr成员_uu=使_共享();
^
main.cpp:17:42:错误:无法基于转换为“std::shared\u ptr”类型来解析重载函数“make_shared”

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

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

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> >’
#包括
#包括
#包括
使用名称空间std;
课堂测试
{
公众:
test(){member_u=make_shared();}
~test(){}
枚举类型
{
错误=0
};
私人:
共享成员;
};
int main()
{
返回0;
}

即使在我们唯一设法重现问题的地方,这也可以很好地编译。

当我用“shared\u ptr member\u=make\u shared()”编译progrem时还可以,为什么?我不能用GCC、Clang或MSVC来重现它。1)保存文件,编译正确的文件(可能是另一个文件的幻影工件)?2) 是否存在“不可见的unicode字符”(这些字符通常不会复制)?如果使用
test::type
而不是
type
,会发生什么情况?您使用的编译器、编译器版本和编译器选项是什么?如果您将
类型
重命名为
abc
或更独特的名称,您是否可以检查会发生什么?你的问题中仍然没有问题。您可以阅读。是的,使用
make_shared
inline初始化成员看起来很奇怪。这是C++17的特性还是什么?@Tobias代码显然不完整,所以我也不确定
shared\u ptr
背后的意图是什么。但是C++11允许像这样初始化成员内联“shared\u ptr member\uu=make\u shared()”,例如:int a=0;我想是的,如果我没有从编译器那里得到任何警告,但如果它是真的,那仍然很奇怪。此外,把事情放在应该放的地方,而不是依靠“魔法”,这是一种很好的做法。初始值设定项就是为了这个目的而存在的,所以给它创建的任务。什么魔法?内联初始值设定项与构造函数一样是一流的。您的示例还分配而不是初始化。(更准确地说,默认初始化,然后赋值。)GCC 5.4(每个OP)没有用C++17编译它。GCC6.1用C++11编译它。Clang还使用C++11编译了它。我倾向于说它是编译器,而不是语言标准。根据,它支持C++98,实验支持C++11。成员初始化和模板直角括号(
>
)是C++11的新功能,因此必须使用
-std=C++11
显式启用。默认情况下,如果没有C++语言选项,则是<代码> -STD= GNU+98 。
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> >’
#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;
}