gpt4 book ai didi

c++ - 如何正确地进行显式模板实例化?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:38:46 25 4
gpt4 key购买 nike

我正在使用模板来实现 CRTP 模式。使用下面的代码,我得到链接器错误(对于基类 CPConnectionBase 中定义的所有方法),如下所示:

error LNK2001: unresolved external symbol "public: void __thiscall CPConnectionBase::start(void)" (?start@?$CPConnectionBase@VTNCPConnection@@@@QAEXXZ)

我想这里的解决方案是显式模板实例化。事实上,我可以在添加时构建我的代码

#include "TNCPConnection.h"
template class CPConnectionBase<TNCPConnection>;

到文件 CPConnectionBase.cpp。这肯定是错误的地方,因为我不想将所有可能的派生类的 header 包含到基类的源代码中(我可能还想在另一个项目中使用其他派生类的基类)。

所以我的目标是在派生类的源文件(TNCPConnection.h或TNCPConnection.cpp)中实例化模板,但我找不到解决方案。添加

template class CPConnectionBase<TNCPConnection>;

到文件 TNCPConnection.cpp 并不能解决我的链接器问题,添加

template<> class CPConnectionBase<TNCPConnection>;

文件 TNCPConnection.cpp 给我一个编译时错误:

error C2908: explicit specialization; 'CPConnectionBase' has already been instantiated

如何在不使基类的实现依赖于派生类的头文件的情况下消除链接器错误?

这是我的代码的框架:

CPConnectionBase.h

template <class Derived>
class CPConnectionBase : public boost::enable_shared_from_this<Derived>
{
public:
void start();
};

CPConnectionBase.cpp

#include "stdafx.h"
#include "CPConnectionBase.h"

template<class Derived>
void CPConnectionBase<Derived>::start()
{
...
}

TNCPConnection.h

#include "CPConnectionBase.h"

class TNCPConnection : public CPConnectionBase<TNCPConnection>
{
public:
void foo(void);
};

TNCPConnection.cpp

#include "stdafx.h"
#include "TNCPConnection.h"

void TNCPConnection::foo(void)
{
...
}

最佳答案

CPConnectionBase::start() 的定义必须在您显式实例化该类的地方可用 - 否则该函数将不会被实例化,并且这种非实例化会悄无声息地发生(使用链接器以下错误)。

标准解决方案是一个 header CPConnectionBase.hpp,它定义了在CPConnectionBase.h 中声明的模板函数。在 TNCPConnection.cpp 中包含 CPConnectionBase.hpp 并在那里显式实例化。

关于c++ - 如何正确地进行显式模板实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9094130/

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