C++ 链接器错误';未解析的外部符号';:使用模板
我有一个基于模板的类[Allotter.h&Allotter.cpp]:C++ 链接器错误';未解析的外部符号';:使用模板,c++,templates,qt4,visual-c++,linker-errors,C++,Templates,Qt4,Visual C++,Linker Errors,我有一个基于模板的类[Allotter.h&Allotter.cpp]: template <typename allotType> class Allotter { public: Allotter(); quint32 getAllotment(allotType*); bool removeAllotment(quint32, int auto_destruct = 0); private: QVector<QPair<quint32, allotType
template <typename allotType> class Allotter {
public:
Allotter();
quint32 getAllotment(allotType*);
bool removeAllotment(quint32, int auto_destruct = 0);
private:
QVector<QPair<quint32, allotType*>> indexReg;
int init_topIndex;
};
令人惊讶的是,构造函数,ActiveListener::ActiveListener()
根本没有引用allocter::allocter()
。然而,第二个参考确实存在。但是我不明白为什么链接器不能解析这个外部符号
错误出现之前的生成输出为:
1>Moc'ing ActiveListener.h...
1>Compiling...
1>stdafx.cpp
1>Compiling...
1>ActiveListener.cpp
1>Allotter.cpp
1>moc_ActiveListener.cpp
1>main.cpp
1>Generating Code...
1>Linking...
我不明白这些是否相关,主要是因为所有这些以前都能完美地工作。只是在我使用模板之后,出现了一个问题。
任何帮助都将不胜感激。非常感谢。您不能将模板拆分为.h和.cpp文件-您需要将模板的完整代码放在.h文件中。因为您不能将模板实现放在.cpp文件中,将.inl文件用于模板实现并从模板头中包含它们被认为是一种良好的做法。一般来说,将模板代码完全写入头文件被认为是最佳做法。这有一个重要的技术原因:当你实例化一个模板时,C++编译器需要从那个模板中生成特定于你指定的模板参数的代码。如果模板代码完全放在标题中,则会自动完成此操作 通过将实现放在cpp文件中,完全可以按照您现有的方式编写模板代码。但是,如果执行此操作,则需要显式实例化要使用的模板实例 在您的情况下,需要将以下行添加到项目中的.cpp文件中:
template class Allotter<QTcpSocket>;
模板类分配器;
@Charles:导出
在现实生活中工作(使用Comeau编译器)。非常感谢:D你能告诉我为什么会发生这种情况吗?我假设,每当编译器需要一个模板中的特定类(即MyClass中的MyClass)时,它都需要源代码来生成所需的类。我说得对吗?是的,你说得对。所有参数化的模板定义都必须放入.h文件中。未参数化的模板定义(即显式专用模板)应视为“普通”代码,这意味着类在.h文件中定义,而函数和对象仅在.h文件中声明,并在.cpp文件中定义。@Jerry the Comeau编译器不真实:-),export
没有进入c++0x,而且可能永远也不会。仅供参考,导出刚刚从c++0x0中删除。感谢大家提供的大量帮助。我自己做了一点研究,找到了一个解决相同问题的方法:我把它放在这里是为了那些碰巧在这里遇到类似问题的人。再次感谢:可能的副本
1>Moc'ing ActiveListener.h...
1>Compiling...
1>stdafx.cpp
1>Compiling...
1>ActiveListener.cpp
1>Allotter.cpp
1>moc_ActiveListener.cpp
1>main.cpp
1>Generating Code...
1>Linking...
template class Allotter<QTcpSocket>;