【发布时间】:2012-02-01 10:18:22
【问题描述】:
我正在使用模板来实现 CRTP 模式。使用下面的代码,我得到了链接器错误(对于在基类CPConnectionBase 中定义的所有方法),如下所示:
错误 LNK2001:无法解析的外部符号“public: void __thiscall CPConnectionBase::start(void)”(?start@?$CPConnectionBase@VTNCPConnection@@@@QAEXXZ)
我想这里的解决方案是显式模板实例化。事实上,当我添加时我可以构建我的代码
#include "TNCPConnection.h"
template class CPConnectionBase<TNCPConnection>;
到文件 CPConnectionBase.cpp。这肯定是错误的地方,因为我不想将所有可能的派生类的标头包含到基类的源代码中(我可能还想在具有其他派生类的另一个项目中使用基类)。
所以我的目标是在派生类的源文件(TNCPConnection.h 或 TNCPConnection.cpp)中实例化模板,但我找不到解决方案。添加
template class CPConnectionBase<TNCPConnection>;
到文件 TNCPConnection.cpp 并没有解决我的链接器问题,并添加
template<> class CPConnectionBase<TNCPConnection>;
到文件 TNCPConnection.cpp 给我一个编译时错误:
错误 C2908:显式特化; 'CPConnectionBase' 已经被实例化了
如何在不使基类的实现依赖于派生类的头文件的情况下摆脱链接器错误?
这是我的代码框架:
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)
{
...
}
【问题讨论】:
标签: c++ templates visual-c++ linker