带有模板的c ++类无法找到其构造函数

15 c++ templates

我有一个问题,我真的不明白.我有一个类Node.

template<class T>
class node {
protected:
    T _data;
public:
    node(T data);   
};
Run Code Online (Sandbox Code Playgroud)

这是在"node.h"文件中.在"node.cpp"文件中,有这个构造函数:

#include "node.h"

template<class T>
node<T>::node (T data) {
    _data = data;
}
Run Code Online (Sandbox Code Playgroud)

虽然编译器没有发现错误,但链接器(ld)告诉我:

/ usr/bin/ld:未定义的符号:

节点<int>的::节点(int)的

奇怪的部分...如果我将构造函数从.cpp移动到.h文件,一切正常.问题出在哪儿?

Mic*_*fik 23

问题是模板不是类 - 您通常不会将它们写在两个单独的文件中.模板类是编译器用于生成类的代码.因此,您的实现代码需要有效内联,即在您发现的标题中.

要更全面地解释为什么必须这样,请参阅C++ FAQ Lite.


Jar*_*Par 13

作为一般规则,您必须将所有模板成员放在头文件中.模板是在使用的基础上编译的,因此整个定义需要在任何使用它们的地方都可用.将代码放在头文件中将解决该问题.

您可以将模板定义放在CPP文件中的唯一时间是模板仅在该CPP文件中使用.原因是它符合整个定义可用于编译的标准.

将node.cpp的内容移动到node.h将解决问题.

奇怪的情景

然后,您还可以将所有内容放在CPP文件中并包含CPP文件.C++以这种方式很灵活.我只提到这个,因为我之前见过.当它碰到我桌子的顶部时,我的下颚实际上擦伤了.