C++ 子类化字符串时出现链接错误

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)

出于各种原因,我将std::string子类化为:

   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); //""
};