我在从模板类创建类对象时遇到问题,在模板类中我需要构造函数也是模板并在创建对象时接受参数。但是,当我尝试创建对象时,我收到一条错误消息,指出我引用了一些不存在的内容。
这是我的代码:
using namespace std;
#include <cstdlib>
template <class Node_Type>
class BinaryTree
{
public:
BinaryTree(Node_Type);
BinaryTree(Node_Type, Node_Type);
BinaryTree(Node_Type, Node_Type, Node_Type);
bool isEmpty();
Node_Type info();
Node_Type inOrder();
Node_Type preOrder();
Node_Type postOrder();
private:
struct Tree_Node
{
Node_Type Node_Info;
BinaryTree<Node_Type> *left;
BinaryTree<Node_Type> *right;
};
Tree_Node *root;
};
#endif
和我的.cpp:
template <class Node_Type>
BinaryTree<Node_Type>::BinaryTree(Node_Type rootNode) {
root = rootNode;
root->left = NULL;
root->right = NULL;
}
.cpp还有更多内容,但它只是其他不相关的功能成员。我上面显示的构造函数是我无法工作的。
在我的主要内容中,我试图通过调用声明我的对象:
BinaryTree<char> node('a');
但是当我尝试这个时,我收到一条错误消息:
undefined reference to `BinaryTree<char>::BinaryTree(char)'
我一直试图解决这个问题两天了。我用Google搜索了我能想到的每个主题,并在Stack Overflow和其他来源上阅读了无数的例子,没有任何帮助。谁能解释一下我的问题是什么?我知道如何完成我的项目,如果语法在C ++中不那么荒谬,我现在就完成了。提前谢谢!
答案 0 :(得分:10)
模板代码在实例化时应该是可见的,这意味着函数的定义也必须在标题中。
答案 1 :(得分:6)
解决方案:您无法将模板实现与头文件分开。只需不要使用cpp文件并将定义放在头文件(.h文件)中。
为什么呢?这是因为cpp文件可以成为预编译源,而模板是编译时对象;因此,除非指定,否则编译器无法确定要使用的类型。所以,只需将所有模板未定义的实现放在标题.h文件中。
答案 2 :(得分:2)
您可以强制在另一个cpp文件中实例化模板。
BinaryTree<char>;
BinaryTree<int>;
BinaryTree<double>;
这样所有功能都不需要在头文件中。 有些人将扩展名.inl用于带有模板实现的文件。因此只有在实例化不存在时才需要.inl文件。