Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GCC给出了一个“;“未定义引用”;依赖默认构造函数的模板化类中的静态数据成员出错_C++_Templates_C++11_Gcc_Static Members - Fatal编程技术网

C++ GCC给出了一个“;“未定义引用”;依赖默认构造函数的模板化类中的静态数据成员出错

C++ GCC给出了一个“;“未定义引用”;依赖默认构造函数的模板化类中的静态数据成员出错,c++,templates,c++11,gcc,static-members,C++,Templates,C++11,Gcc,Static Members,我有一个与此类似的问题: 但是他们使用的变通方法对我不起作用 我有一个带有静态数据成员的CRTP类,其中一个是std::mutex。不幸的是,GCC的(4.8.2)链接器给了我这个互斥体一个“未定义的引用”错误。叮当声(3.4)没有。有解决办法吗?最初的问题(链接在上面)调用了静态数据成员上的复制构造函数,强制GCC发出一个符号,但是由于我的数据成员是std::mutex,这不是一个选项——复制构造函数被删除,并且没有参数构造函数。我刚用水管冲洗过吗 我认为问题不在于std::mutex,而在

我有一个与此类似的问题:

但是他们使用的变通方法对我不起作用

我有一个带有静态数据成员的CRTP类,其中一个是std::mutex。不幸的是,GCC的(4.8.2)链接器给了我这个互斥体一个“未定义的引用”错误。叮当声(3.4)没有。有解决办法吗?最初的问题(链接在上面)调用了静态数据成员上的复制构造函数,强制GCC发出一个符号,但是由于我的数据成员是std::mutex,这不是一个选项——复制构造函数被删除,并且没有参数构造函数。我刚用水管冲洗过吗

我认为问题不在于std::mutex,而在于GCC如何处理依赖于默认构造函数的模板类中的静态数据成员

谢谢你的帮助

以下是我的问题的一个简单版本: test.hh

获取错误

/tmp/cclyxUfC.o: In function `Foo::set_bar(int)':
test.cc:(.text+0x86): undefined reference to `CRTP_class<Foo>::mutex_'
collect2: error: ld returned 1 exit status
/tmp/cclyxUfC.o:在函数“Foo::set_bar(int)”中:
test.cc:(.text+0x86):对“CRTP\u类::互斥体”的未定义引用
collect2:错误:ld返回了1个退出状态
(编辑1:回应评论员的建议,这是一个重复的错误,“为什么模板必须在头文件中?”--将单独的模板专门化放在.cc文件中而不是放在.hh文件中并没有什么奇怪的地方--如果您有一个互斥体,并且出于明显的原因,您只需要该互斥体的一个副本,那么这正是您所需要的。如果您在头文件中声明了一个静态数据成员,那么每个翻译单元在#includes时,标头将以其自己的互斥副本结束,在这种情况下,它不履行其确保互斥的职责)


(编辑2:Ooops!我链接到了错误的先前bug。)

来自GCC的Jonathan Wakely对bugzilla的报道:

问题似乎是我没有为互斥体提供初始化器。其语法是提供开放式和闭合式花括号

template<> std::mutex CRTP_class< Foo >::mutex_;
模板std::mutex CRTP\u类::mutex\uu;
变成

template<> std::mutex CRTP_class< Foo >::mutex_{};
template std::mutex CRTP_class::mutex{};

(让互斥体存在于.cc文件中没有问题)

不要将模板实现放在单独的转换单元中,而是放在要声明它的头中。另请参见和Q&a。在这种情况下,将静态数据成员放在.cc文件中是完全合理的——这不是问题所在(请参阅带有互斥变量的问题),因此如果您能将此问题取消标记为重复问题,以便我可以发布答案,我将不胜感激。我从GCC获得了一个答案,我将在这里发布。特别是,将模板std::mutex CRTP_class::mutex;更改为模板std::mutex CRTP_class::mutex{};修复了此测试用例。好的,我将删除的重复标记。期待您的回答。CRTP肯定会有所不同,很抱歉,我在浏览您的第一个代码示例时没有发现这一点。这是声明和定义之间非常复杂的区别(我不喜欢)。+1
g++ -std=c++0x main.cc test.cc -I.
/tmp/cclyxUfC.o: In function `Foo::set_bar(int)':
test.cc:(.text+0x86): undefined reference to `CRTP_class<Foo>::mutex_'
collect2: error: ld returned 1 exit status
template<> std::mutex CRTP_class< Foo >::mutex_;
template<> std::mutex CRTP_class< Foo >::mutex_{};