ошибка C2143: синтаксическая ошибка: отсутствует ';' перед '*' при объявлении указателя

Это заголовочный файл для моего бинарного дерева. У меня есть класс под названием TreeNode, и, конечно же, у класса BinaryTree есть указатель на его корень.

И я получил следующие три ошибки

error C2143: syntax error : missing ';' before '*'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

И код для заголовочного файла BinaryTree

#pragma once

#include <fstream>
#include <iostream>
#include "Node.h"
using namespace std;

class BinaryTreeStorage
{
private:
    TreeNode* root;

public:
    //Constructor
    BinaryTreeStorage(void);

    //Gang Of Three
    ~BinaryTreeStorage(void);
    BinaryTreeStorage(const BinaryTreeStorage & newBinaryTreeStorage);
    BinaryTreeStorage& operator=(const BinaryTreeStorage & rhs);

    //Reading and writing
    ofstream& write(ofstream& fout);
    ifstream& read(ifstream& fin);

};

//Streaming
ofstream& operator<<(ofstream& fout, const BinaryTreeStorage& rhs);
ifstream& operator>>(ifstream& fin, const BinaryTreeStorage& rhs);

ошибка в 11 строке

    TreeNode* root;

Я провел несколько дней, пытаясь избавиться от этой ошибки и полностью опустошен.

Это ошибка о неправильном пространстве имен? Или, может быть, класс TreeNode объявлен неправильно?

И на всякий случай код для заголовочного файла TreeNode

#pragma once
#include <string>
#include "BinaryTreeStorage.h"

using namespace std;

class TreeNode
{
private:
    string name;
    TreeNode* left;
    TreeNode* right;

public:
    //Constructor
    TreeNode(void);
    TreeNode(string data);

    //Gang of Three
    ~TreeNode(void);
    TreeNode(const TreeNode* copyTreeNode);


    //Reading and writing
    ofstream& write(ofstream& fout);

    //Add TreeNode
    void addTreeNode(string data);

    //Copy tree
    void copy(TreeNode* root);
};

Заранее спасибо.


person Aleksey Belezjak    schedule 05.05.2012    source источник
comment
Спасибо всем за ответ на вопрос, это был действительно глупый вопрос. Вот что происходит, если вы программируете на C# раньше, чем на C++.   -  person Aleksey Belezjak    schedule 05.05.2012


Ответы (4)


Вместо

#include "Node.h"

просто вперед объявите класс:

class TreeNode;

Кроме того, почему вы включаете BinaryTreeStorage.h в Node.h? В нем нет необходимости, поэтому удалите его.

person Luchian Grigore    schedule 05.05.2012

Похоже, что Node.h включает BinaryTreeStorage.h, поэтому, когда вы пытаетесь скомпилировать Node.h (класс TreeNode), он сначала компилирует BinaryTreeStorage, но для этого нужно знать, что такое TreeNode, который еще не был скомпилирован.

Обойти это можно, перенаправив объявление класса:

    class TreeNode;

который говорит компилятору ожидать, что класс типа TreeNode будет определен позже, но тем временем вы можете объявить указатели и ссылки этого типа. Последнее, что нужно сделать, это удалить файл #include "Node.h". Это нарушает вашу циклическую ссылку.

person SirGuy    schedule 05.05.2012
comment
TY за понимание циклических ссылок, это помогло решить мою проблему! +1 - person teejay; 07.08.2014

Вы используете ofstream в определении класса TreeNode, но не включили это:

#include <fstream> //include this in Node.h

Пожалуйста, сделай так.

Также нет необходимости включать BinaryTreeStorage.h в Node.h. Это делает вещь круглой.

person Nawaz    schedule 05.05.2012

Вперед объявить TreeNode, т. е. добавить class TreeNode; перед class BinaryTreeStorage{};

person Bhargava    schedule 05.05.2012