我有一个问题,我真的不明白.我有一个类Node.
templateclass node { protected: T _data; public: node(T data); };
这是在"node.h"文件中.在"node.cpp"文件中,有这个构造函数:
#include "node.h" templatenode ::node (T data) { _data = data; }
虽然编译器没有发现错误,但链接器(ld)告诉我:
/ usr/bin/ld:未定义的符号:
节点
的::节点(int)的
奇怪的部分...如果我将构造函数从.cpp移动到.h文件,一切正常.问题出在哪儿?
问题是模板不是类 - 您通常不会将它们写在两个单独的文件中.模板类是编译器用于生成类的代码.因此,您的实现代码需要有效内联,即在您发现的标题中.
要更全面地解释为什么必须这样,请参阅C++ FAQ Lite.
作为一般规则,您必须将所有模板成员放在头文件中.模板是在使用的基础上编译的,因此整个定义需要在任何使用它们的地方都可用.将代码放在头文件中将解决该问题.
您可以将模板定义放在CPP文件中的唯一时间是模板仅在该CPP文件中使用.原因是它符合整个定义可用于编译的标准.
将node.cpp的内容移动到node.h将解决问题.
奇怪的情景
然后,您还可以将所有内容放在CPP文件中并包含CPP文件.C++以这种方式很灵活.我只提到这个,因为我之前见过.当它碰到我桌子的顶部时,我的下颚实际上擦伤了.