C++ 子类化字符串时出现链接错误
出于各种原因,我将std::string子类化为:C++ 子类化字符串时出现链接错误,c++,googletest,subclassing,C++,Googletest,Subclassing,出于各种原因,我将std::string子类化为: class CotengString : public string { public: // Constructors CotengString(); CotengString(const char* ch) : string(ch) {} CotengString(const string& str) : string(str)
class CotengString : public string
{
public:
// Constructors
CotengString();
CotengString(const char* ch) : string(ch) {}
CotengString(const string& str) : string(str) {}
virtual ~CotengString() {};
//Operator"="
CotengString& operator=(const string& str) { return (CotengString&)this->assign(str); }
CotengString& operator=(const char* ch) { return (CotengString&)this->assign(ch); }
};
在DLL内,我希望使用此代码所有编译正确。但是在我的Google测试项目中,我在切换到子类字符串后出现了这个错误
LNK2005 "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(char const *,unsigned int)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBDI@Z) already defined in gtest.lib(gtest-all.obj) Devices.Spectro.CppTest <path>\Devices.Spectro.CppTest\Devices.Spectro.Cpp.lib(Devices.Spectro.Cpp.dll)
LNK2005“public:u thiscall std::basic_string::basic_string(char const*,unsigned int)”(?0?$basic_string@DU?$char_traits@D@性病病毒$allocator@D@2@@std@@QAE@PBDI@Z) 已在gtest.lib(gtest all.obj)Devices.Spectro.CppTest\Devices.Spectro.CppTest\Devices.Spectro.CppTest\Devices.Spectro.Cpp.lib(Devices.Spectro.Cpp.dll)中定义
我的直觉是我错过了一些明显的东西。但我不知道它可能是什么好吧,那么作为答案
第一原因
在我看来,这似乎是头文件的多个包含的问题。
这导致编译器想要再次编译函数,或者在本例中是分配器,并检测到“哦,我已经编译过了!”
因此,修复方法是在头文件中添加以下内容:
#ifndef CUSTOM_STRING_IMPLEMENTATION_HEADER
#define CUSTOM_STRING_IMPLEMENTATION_HEADER
....
#endif
第二个原因
但是,如果不是这样,可能您正在尝试在代码中再次编译此文件,该代码使用的dll已包含编译的类。
根据你的日志文件,我个人认为这是第二个原因。据说您的库中已经编译了分配器
例子:
如果您只使用头文件,这将导致一个大问题。看这里
Dll代码:
SomeHeaderFile.hpp
class NiceClass{
//Constructor is implemented. That causes several problems now!
NiceClass{
}
...
}
您的应用程序代码(使用dll):
SomeNice应用程序代码:
//Linker error now! It's already compiled right into your dll!
#include <SomeHeaderFile.hpp>
int main(){
NiceClass niceClassInstance;
return 0;
}
我试一下第二个原因意味着,你必须找到你可以再次编译同一个类的地方。你能发布更多的代码吗?解决方案应该能解决你的问题。D:谢谢你,我已经按照这些思路实施了;)它解决了一些链接错误(我得到了18个,现在我得到了其中的15个)但是我想我必须添加更多重载构造函数你真的需要从std::string中派生吗?也许这段代码只是一个缩写例如,一般来说,你不应该从标准容器中继承…从标准容器中继承并不比从任何其他容器中继承更糟糕,但无偿继承可能是一个危险信号。这里显示的样板也有点臭。可能
使用string::string;使用字符串::运算符=代码>将比手动重新实现更好。
class CotengString : public string
{
public:
// Constructors
CotengString();
CotengString(const char* ch) : string(ch); //Use cpp file!
CotengString(const string& str) : string(str); //""
virtual ~CotengString(); //""
//Operator"="
CotengString& operator=(const string& str); //Same for this
CotengString& operator=(const char* ch); //""
};