Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 链接器错误';未解析的外部符号';:使用模板_C++_Templates_Qt4_Visual C++_Linker Errors - Fatal编程技术网

C++ 链接器错误';未解析的外部符号';:使用模板

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

我有一个基于模板的类[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*>> 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>;