gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:12:49 26 4
gpt4 key购买 nike

我目前有一个程序,我的主要代码在文件 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 中的函数。

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

错误 41 error LNK2005: "public: __thiscall RecordPocket::RecordPocket(int)"(??0?$RecordPocket@VT@@@@QAE@H@Z) already defined in classimplementation.obj functions.obj

我知道类实现代码确实应该保留在包含文件之外,但由于必须将类函数保留在本地的模板类限制,我似乎(在我的新手看来)别无选择。

有没有人遇到过这种情况,可以提供任何建议。我尝试使用标准 ifndef CLASSIMP、#define CLASSIMP 代码和 PRAGMA ONCE 围绕我从 classimplementation.cpp 移动到 class.h 的函数,但两者都没有任何区别。

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

最佳答案

您可以将模板函数保留在 template<> class what{/HERE/} 中;

template<typename T>
class MyTempClass{
void myFunctions{
// code here
}
}

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

关于c++ - 模板类,导致链接问题的实现代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1421485/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com