6

我在从模板类创建类对象时遇到问题,在该模板类中,我需要构造函数也是模板并在创建对象时接受参数。但是,当我尝试创建对象时,我收到一条错误消息,指出我正在引用不存在的东西。

这是我的代码:

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++ 中的语法不是那么荒谬,我现在已经完成了。提前致谢!

4

3 回答 3

10

模板代码在实例化时应该是可见的,这意味着函数的定义也必须在头文件中。

于 2013-09-18T19:37:57.933 回答
6

解决方案:您不能将模板实现与头文件分开。简单地不要使用 cpp 文件并将定义放在头文件(.h 文件)中。

为什么?这是因为 cpp 文件可以成为预编译源,而模板是编译时对象;因此,除非指定,否则编译器无法决定使用哪种类型。因此,只需将所有模板未定义的实现放在头 .h 文件中。

于 2013-09-18T19:38:07.460 回答
2

您可以强制在另一个 cpp 文件中实例化模板。

BinaryTree<char>;
BinaryTree<int>;
BinaryTree<double>;

这样,所有函数都不需要在头文件中。有些人将扩展名 .inl 用于具有模板实现的文件。因此,仅当实例化尚不存在时才需要 .inl 文件。

于 2015-11-20T09:34:02.260 回答