从其他类声明类类型变量会产生C2143错误(在'*'之前缺少';')

时间:2017-08-11 01:54:05

标签: c++

我用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错误,其中显示缺少';'在'*'之前。我无法理解这一点,因为从其他类声明类类型变量看起来对我来说完全没问题。 从其他类声明类类型变量会产生这种错误吗?我被困在这里所以请帮助我解决问题。谢谢。

1 个答案:

答案 0 :(得分:3)

你遇到一些问题:

首先: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的声明与您的声明有何不同。