C++ GCC给出了一个“;“未定义引用”;依赖默认构造函数的模板化类中的静态数据成员出错
我有一个与此类似的问题: 但是他们使用的变通方法对我不起作用 我有一个带有静态数据成员的CRTP类,其中一个是std::mutex。不幸的是,GCC的(4.8.2)链接器给了我这个互斥体一个“未定义的引用”错误。叮当声(3.4)没有。有解决办法吗?最初的问题(链接在上面)调用了静态数据成员上的复制构造函数,强制GCC发出一个符号,但是由于我的数据成员是std::mutex,这不是一个选项——复制构造函数被删除,并且没有参数构造函数。我刚用水管冲洗过吗 我认为问题不在于std::mutex,而在于GCC如何处理依赖于默认构造函数的模板类中的静态数据成员 谢谢你的帮助 以下是我的问题的一个简单版本: test.hh 获取错误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,而在
/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
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_{};