C++ 模板类,导致链接问题的实现代码

C++ 模板类,导致链接问题的实现代码,c++,class,templates,linker,C++,Class,Templates,Linker,我目前有一个程序,其中我的主代码位于main.cpp文件中。 Main.cpp包含一个头文件“class.h”,该头文件声明了Main.cpp中使用的类 同样在main.cpp中,我有函数声明,声明我在main.cpp中使用的函数。 这些函数的代码位于单独的.cpp文件functions.cpp中。 与main.cpp一样,functions.cpp也包括class.h,因为类类型在函数中使用 h只包含类声明。 class.h的实现代码位于单独的.cpp文件classimplementation

我目前有一个程序,其中我的主代码位于main.cpp文件中。 Main.cpp包含一个头文件“class.h”,该头文件声明了Main.cpp中使用的类

同样在main.cpp中,我有函数声明,声明我在main.cpp中使用的函数。 这些函数的代码位于单独的.cpp文件functions.cpp中。 与main.cpp一样,functions.cpp也包括class.h,因为类类型在函数中使用

h只包含类声明。 class.h的实现代码位于单独的.cpp文件classimplementation.cpp中

在我尝试在class.h中创建一个模板类之前,一切都很好。 然后我会遇到链接问题。研究和测试表明,这是因为模板类函数的定义需要与声明一起驻留在class.h中

因此,我从ClassImplements.cpp中取出了所需的代码,并将其放入class.h中。 这确实解决了我最初的链接问题,但相反,我得到了更多的链接错误,这些错误似乎告诉我,我正在尝试重新定义移动到class.h中的函数

我认为这是因为main.cpp调用class.h,functions.cpp再次调用class.h。 因此,类h中的函数被定义了两次:

错误41错误LNK2005:“公共:u thiscall RecordPocket::RecordPocket(int)”(?0$RecordPocket@VT@@@@QAE@H@Z) 已在classimplementation.obj functions.obj中定义

我知道类实现代码确实应该被排除在include文件之外,但由于模板类的限制,必须将类函数保持在本地,我(在我的新手看来)似乎没有选择

有没有人曾经遇到过这种情况,可以提供任何建议。 我曾经尝试过使用标准的ifndef CLASSIMP、define CLASSIMP code和PRAGMA来包围从classimplementation.cpp迁移到class.h的函数,但都没有任何区别


如果所有其他操作都失败,我会将函数从functions.cpp移到main.cpp,这样类.h只会被调用一次,但我更愿意找出我做错了什么,因为我确信它会再次发生。

您可以将模板函数保留在模板类中,{/HERE/}

模板
类MyTempClass{
无效函数{
//代码在这里
}
}

编辑:我删除了由Glen更正的代码

您可以将模板函数保留在模板类what{/HERE/}中

模板
类MyTempClass{
无效函数{
//代码在这里
}
}

编辑:我删除了由Glen更正的代码

我认为您的问题在于这些问题。正如您所暗示的,任何模板函数定义(即模板类的成员函数的模板函数)都需要在.h文件中完全表达,因为当编译器找到模板的特定实例时,它需要构建函数。 您解决了这个问题,并将一些实现移到了class.h文件中。现在,如果链接器在多个模块中找到MyFunction(),则is仅丢弃其中一个模块,将报告无链接器错误


但是,您不能在两个不同的模块中定义相同的非模板函数,因为这会产生上面提到的错误。所以我怀疑您还将一些非模板功能移到了.h文件中;因此,将其包含在两个单独的obj文件中并生成链接器错误。您引用的错误消息支持了这一理论,因为我注意到u thiscall RecordPocket::RecordPocket(int)似乎不是模板。

我认为您的问题是围绕这些问题。正如您所暗示的,任何模板函数定义(即模板类的成员函数的模板函数)都需要在.h文件中完全表达,因为当编译器找到模板的特定实例时,它需要构建函数。 您解决了这个问题,并将一些实现移到了class.h文件中。现在,如果链接器在多个模块中找到MyFunction(),则is仅丢弃其中一个模块,将报告无链接器错误


但是,您不能在两个不同的模块中定义相同的非模板函数,因为这会产生上面提到的错误。所以我怀疑您还将一些非模板功能移到了.h文件中;因此,将其包含在两个单独的obj文件中并生成链接器错误。您引用的错误消息支持了这一理论,因为我注意到uu thiscall RecordPocket::RecordPocket(int)似乎不是模板。

inline关键字不是必需的。如果您在类声明之外声明方法,则需要内联以避免重新定义/声明方法/定义方法/@Arkaitz Jimenez,不需要。试试看see@Glen,你是对的,它不是必需的,我猜2个被实例化,一个被编译器删除。内联关键字不是必需的。如果你在类声明之外声明方法,你需要内联以避免重新定义/声明方法/定义方法/@Arkaitz Jimenez,不,你不需要。试试看see@Glen,你是对的,它不是必需的,我猜2个被实例化了,一个被编译器删除了。可以发布一些关于类中代码的示例代码。h?认为在这里发布一些代码会很有用;你的问题应该很容易解决,但有点难以识别。你可以在课堂上发布一些关于你的代码的示例代码。h?认为在这里发布一些代码会很有用;你的问题应该很容易解决,但有点难以识别。
template<typename T>
class MyTempClass{
     void myFunctions{
      // code here
     }
 }