从其他类声明类类型变量会给出 C2143 错误(在"*"之前缺少";")

Declaring class type variable from other class gives C2143 error (missing ';' before '*" )

本文关键字:错误 类型变量 声明 其他 C2143      更新时间:2023-10-16

我正在用C++编码通用树,它将每个节点表示为类变量TreeNode,每个节点的子节点(可以大于2个(表示为TreeNodeList,这是TreeNodes的链表。

这是我到目前为止一直在处理的代码。

#include "stdafx.h"
#include <iostream>
using namespace std;
template <typename E>
class TreeNode {
private:
TreeNode* parent;
TreeNodeList* children; // This line gives C2143 Error, missing ';' before '*'
TreeNode* next;
E data;
public:
friend class TreeNodeList;
TreeNode() {}
TreeNode(E& data) {this->data = data;}
void setParent(TreeNode<E> &p) {parent = &p;}
void setData(E& data) { this->data = data; }
void setNext(TreeNode<E>& n) { next = &n; }
void addChild(TreeNode<E>& ch) {
children.add(ch);
ch.setParent(this);
}
TreeNode<E>* getChildren() const { return children; }
TreeNode<E>* getNext() const { return next; }
TreeNode<E>* getParent() const { return parent; }
const E& getData() const { return data; }
};
template <typename E>
class TreeNodeList {
private:
TreeNode* head;
TreeNode* last;
int size;
public:
TreeNodeList() : head(NULL), last(NULL) { head = last; size = 0; }
~TreeNodeList() {
while (!empty()) {
removeFront();
}
}
const bool empty() const {
return size = 0;
}
void removeFront() {
if (empty()) {
return; //can't remove empty list
}
else {
TreeNode<E>* old = head;
head = head->getNext();
delete old;
}
}
void add(TreeNode<E>& p) {
last->setNext(p);
last = last->getNext();
}
void print() {
TreeNode<E>* p = head;
while (p != NULL) {
cout << p->getData() << " ";
p = p->getNext();
}
}
};

我写的"TreeNodeList* children"行一直给我C2143错误,在"*"之前说缺少";"。我无法理解这一点,因为从其他类声明类类型变量对我来说看起来完全没问题。 从其他类声明类类型变量会给出这种错误吗?我被困在这里,所以请帮助我解决问题。谢谢。

你对这一行有一些问题:

第一:尚未声明TreeNodeList。您可以通过向前声明来解决此问题:

class TreeNodeList;
template <typename E>
class TreeNode {

但是,这对您不起作用,因为:

第二:TreeNodeList是一个模板。因此,您需要在使用模板参数时指定它(并将其向前声明为模板(。您可以按如下方式修复children声明:

template<typename E>
class TreeNodeList;
template <typename E>
class TreeNode {
private:
TreeNode* parent;
TreeNodeList<E>* children;

请注意children声明与您的声明有何不同。