我目前有一个程序,我的主要代码在main.cpp文件中。 Main.cpp包含一个头文件“class.h”,它声明了一个在main.cpp中使用的类。
同样在main.cpp中我有函数声明来声明我在main.cpp中使用的函数。 这些函数的代码位于单独的.cpp文件fucntions.cpp中。 与main.cpp一样,functions.cpp也包含class.h,因为类函数在函数中使用。
class.h仅包含类声明。 class.h的实现代码位于单独的.cpp文件classimplementation.cpp。
中在我尝试将class.h中的类作为模板类之前,一切正常。 然后我得到链接问题。研究和测试告诉我,这是因为模板类函数的定义需要与声明一起驻留在class.h中。
因此我从classimplementations.cpp中取出了所需的代码并将其放入class.h中。 这确实解决了我原来的链接问题,但是我得到了更多链接错误,似乎告诉我我正在尝试重新定义我移动到class.h中的函数。
我认为这是因为main.cpp和function.cpp再次调用class.h。 因此,class.h中的函数被定义了两次:
错误41错误LNK2005:“public:__thiscall RecordPocket :: RecordPocket(int)”(?? 0?$ RecordPocket @VT @@@@ QAE @ H @ Z)已在classimplementation.obj functions.obj中定义
我知道类实现代码应该真的不包含在包含文件中,但是由于模板类限制必须保持类函数本地化我出现(在我的新手脑海中)没有选择。
是否有人参与过这种情况,可以提供任何建议。 我尝试使用标准的ifndef CLASSIMP ,#define CLASSIMP 代码和PRAGMA ONCE将我从classimplementation.cpp移动到class.h的函数包围起来但是没有任何区别。< / p>
如果所有其他方法都失败了,我会将函数从functions.cpp移动到main.cpp中,这样class.h就会被调用一次,但我宁愿发现我做错了什么,因为我确信它会再次发生。
答案 0 :(得分:2)
您可以将模板功能保留在模板中&lt;&gt;分类{/ HERE /};
template<typename T>
class MyTempClass{
void myFunctions{
// code here
}
}
已编辑:我删除了Glen修正的代码
答案 1 :(得分:1)
我认为您的问题围绕这些问题展开。由于暗示任何模板函数定义(即模板类的成员函数的模板函数)需要在.h文件中完全表达,因为当编译器找到模板的特定实例时,它需要构建函数。 你想出了这个并将一些实现移动到你的class.h文件中。现在,如果链接器在多个模块中找到MyFunction(),那么只丢弃其中一个模块,报告没有链接器错误。
但是,您无法在两个不同的模块中定义相同的非模板函数,因为这会生成您上面的错误。所以我怀疑你也将一些非模板功能移到了.h文件中;因此将其包含在两个单独的obj文件中并生成链接器错误。这个理论是由你引用的错误消息支持的,因为我注意到__thiscall RecordPocket :: RecordPocket(int)似乎不是模板。