gpt4 book ai didi

c++ - 尝试将类转换为模板后编译代码出错

转载 作者:行者123 更新时间:2023-11-28 03:52:20 24 4
gpt4 key购买 nike

1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall MyList<class Event>::~MyList<class Event>(void)" (??1?$MyList@VEvent@@@@QAE@XZ) referenced in function _main

知道哪里出了问题吗?我之前有一个工作类,然后我尝试对其进行模板化,但我在上面遇到了这个错误。任何想法 ?我有点迷路了。

主要是我用这个:

MyList<Event> eventManager;

最佳答案

模板与 C++ 的编译模型的配合很奇怪,因为它们不是可执行代码——它们是可执行代码的模板。因此,将类划分为 .h/.cpp 对的标准模型对于模板无法正常工作。

您通常将一个类分解为带有接口(interface)的 .h 文件和带有实现的 .cpp 文件的原因是,通常情况下,.cpp 文件可以单独编译,同时引用其他 .cpp 文件中定义的代码,因为编译文件后,链接器会将所有引用拼凑在一起。由于所有 .cpp 都编译为包含可执行代码的目标文件,因此一切都会正常运行。

然而,有了模板,这个系统就会崩溃。如果您定义一个模板类,然后将其成员函数的所有实现放入一个 .cpp 文件中,那么当编译器编译该文件时,它不会找到任何代码 - 只是用于代码的模板,并且所以它不会为模板方法生成任何目标代码。因此,在链接时,您将在尝试调用模板类的每个成员函数时遇到错误,因为没有可用代码。

我不确定这是否是导致您的特定错误的原因,但从您的描述来看,情况确实如此,尤其是因为您更改了一个非模板类(可能拆分为 .h/.cpp 对) 到模板类中。

要解决此问题,传统的 C++ 解决方案只是为模板提供一个 .h 文件,而没有随附的源文件。您只需将源文件中的所有代码移至 header 即可完成此操作。我喜欢在 header 中放一行标记接口(interface)停止和实现开始的位置,通常类似于

/* * * * * Implementation Below This Point * * * * */

/* * * * * Here be Dragons * * * * */

为了更清楚地说明这一点。

希望这对您有所帮助!

关于c++ - 尝试将类转换为模板后编译代码出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5047732/

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