【发布时间】:2013-09-23 17:06:18
【问题描述】:
我在从模板类创建类对象时遇到问题,我需要构造函数也是模板并在创建对象时接受参数。但是,当我尝试创建对象时,我收到一条错误消息,指出我正在引用不存在的内容。
这是我的代码:
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++ 中的语法不是那么荒谬,我现在已经完成了。提前致谢!
【问题讨论】:
-
问题的答案是完全编译器告诉你的。
Tree_Node*不是char。 -
简短且不精确:因为您的函数主体依赖于
.cpp文件中的模板。它需要与您的.h文件一起直接在您的类定义中,或者如果您不喜欢将它放在那里,因为它更易于阅读,请将函数声明为inline并将其移到类定义之外, 在同一个文件中或在您包含在.h中的.hpp中 -
@WhozCraig 是对的
root的类型是Tree_Node*而不是char -
@StephenFish 这也不对,但没关系。是你的葬礼。您的根指针和树节点左右指针全部未初始化。
-
@t.niese 当然是。我看到的错误是一个完全不同的错误(奇怪的是,OP的编译器显然让它通过了,而我的......正在展示你所描述的内容。当他回答“我将'root = rootNode'更改为'root-> Node_Info = rootNode',它现在工作得很好。”我畏缩了。走出一个未定义的行为,然后进入另一个不同的行为。
标签: c++ class templates constructor