1

我有以下代码:

template <typename T>
class Node{
public: 
    Node<T>(T data){
        this->data = data;
    }
    T data;
    Node<T> left; 
    Node<T> right;
};

但它不喜欢我如何拥有与它们所在的类相同类型的成员变量,因为编译器不知道“节点”是什么。

4

3 回答 3

6

您要声明leftandrightNode<T> *

Node<T> *left;
Node<T> *right;

问题不仅在于编译器还没有完整的定义,还在于您试图说一个节点包含两个其他节点,因此对于节点的大小没有合理的定义。

于 2012-06-25T02:22:57.477 回答
0

这--->Node<T> left,right导致编译器错误。要修复它,您可以将 left 和 right 声明为指针、引用或static节点:

template<typename T>
class Node {
public:
    Node(T data) : data(data){}
    T data;
    Node<T> *left, *right; // Ok
              /* OR */
    Node<T> &left, &right; // Ok
              /* OR */
    static Node<T> left, Node<T> right; // also Ok

    Node<T> left, right; // No way, causes error

};

于 2012-06-26T16:14:30.080 回答
0

创建转发类声明:

template<typename T>
class Node;

template<typename T>
class Node {
public:
   T data;
   Node<T> left, right;
   // implementation here
}
于 2012-06-25T02:28:05.767 回答