我在一个文件中定义了一个全局函数
namespace PlusTest
{
std::string plusSuiteName()
{
return "PlusTest";
}
}
然后工程中有两个文件分别包含了(直接或间接)这个头文件。就会出现重定义的错误:
1>Linking...
1> : error LNK2005: "void __cdecl ArraySet(double *,int,double)" (?ArraySet@@YAXPANHN@Z) already defined in
然后,我把函数体的定义放到了中,代码如下:
:
namespace PlusTest
{
std::string plusSuiteName();
}
///
:
std::string plusSuiteName()
{
return "PlusTest";
}
结果又会出现下面的错误:
1> : error LNK2019: error LNK2019: unresolved external symbol "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl PlusTest::plusSuiteName(void)" (?plusSuiteName@PlusTest@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) referenced in function "void __cdecl `dynamic initializer for 'autoRegisterRegistry__8''(void)" (??__EautoRegisterRegistry__8@@YAXXZ)
思考了半天,有三种种解决方法:
1.去掉.h中的namespace PlusTest{};
2.在.cpp中加上namespace PlusTest{};
3.不把函数体的实现放到.cpp中,而是改成内联函数或者是静态函数;代码如下:
:
namespace PlusTest
{
inline std::string plusSuiteName() //inline=>static 也可以
{
return "PlusTest";
}
}