私は次のコードを持っています:
template <typename T>
class Node{
public:
Node<T>(T data){
this->data = data;
}
T data;
Node<T> left;
Node<T> right;
};
しかし、コンパイラーは「ノード」が何であるかを知らないので、それらが属するクラスと同じタイプのメンバー変数をどのように持っているかは気に入らない。
あなたは宣言したいとleft
思いright
ますNode<T> *
:
Node<T> *left;
Node<T> *right;
問題は、コンパイラがまだ完全な定義を持っていないことだけでなく、ノードに他の2つのノードが含まれていると言おうとしているため、ノードのサイズについて適切な定義がないことです。
転送クラス宣言を作成します。
template<typename T>
class Node;
template<typename T>
class Node {
public:
T data;
Node<T> left, right;
// implementation here
}
これ --->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
};