грешка 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