C:避免重复的符号链接器错误
发布时间:2020-12-16 09:52:05 所属栏目:百科 来源:网络整理
导读:我收到链接器错误: duplicate symbol __ZN5ENDF64FileILNS_7MF_enumE1EE4readEv in: Read.cpp.o Material.cpp.o 其中重复的符号名称是: $c++filt __ZN5ENDF64FileILNS_7MF_enumE1EE4readEv ENDF6::File(ENDF6::MF_enum)1::read() 我知道我不能在多个地方定
我收到链接器错误:
duplicate symbol __ZN5ENDF64FileILNS_7MF_enumE1EE4readEv in: Read.cpp.o Material.cpp.o 其中重复的符号名称是: $c++filt __ZN5ENDF64FileILNS_7MF_enumE1EE4readEv ENDF6::File<(ENDF6::MF_enum)1>::read() 我知道我不能在多个地方定义相同的功能 – 这是导致此链接器错误的原因. (我已经看到了这个问题:ld: duplicate symbol)我不认为我在多个地方定义了read()函数,但链接器(clang)说我做了. 我在哪里复制read()符号? 我的代码结构如下所示: //MFs.hpp #ifndef MFS_HPP #define MFS_HPP enum class MF_enum { ... } #endif //File.hpp #ifndef FILE_HPP #define FILE_HPP #include "MFs.hpp" // Definition of class File template<> class File { ... } // Definition of File<...>::read() function template <> void File<1>::read() { std::cout << "Reading into MF=1"<< std::endl; } #endif 没有File.cpp,因为File类是模板化的.所有定义(和声明)都在File.hpp中 // Material.cpp #include "File.hpp" ... // Material.hpp #ifndef MATERIAL_HPP #define MATERIAL_HPP #include "File.hpp" ... #endif 最后是驱动代码: // Read.cpp #include "Material.hpp" #include "File.hpp" int main (){ ... } 解决方法
(完成)模板的特化不是模板本身.如果您正在专门使用该函数,那么您需要在标题中声明它并在单个转换单元中提供实现,或者使内联定义:
// Header [1] template <int> class File { // ... void open(); }; template <> void File<1>::open(); // just declaration // Single .cpp template <> void File<1>::open() { ... } 或者: // Header [2] template <int> class File { // ... void open(); }; template <> inline void File<1>::open() { ... } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |