C++ ERROR: forward declaration of 'struct...?

amorimluc picture amorimluc · Feb 20, 2013 · Viewed 21.4k times · Source

cyclical inclusion problem

I forward declare one of the classes in the header of the other in an attempt to solve their cyclical inclusion. Here are my two files:

The first file (Parameter.h):

#pragma once
#include "Token.h"`

class Expression;

class Parameter {
public:

    Parameter() {
        string = new Token();
        identifier = new Token();
        expr = new Expression();
    }

    Token* string;
    Token* identifier;
    Expression* expr;
};

The second file (Expression.h):

#pragma once
#include "Token.h"
#include "Parameter.h"

class Expression {
public:
    Expression() {
        param1 = new Parameter();
        param2 = new Parameter();
        op = new Token();
    }

    Expression(Parameter* p1, Token* o, Parameter* p2) {
        param1 = p1;
        param2 = p2;
        op = o;
    }

    Parameter* param1;
    Parameter* param2;
    Token* op;
};

As you can see, I forward declare Expression in Parameter.h, but I'm still getting the following two errors:

forward declaration of 'struct Expression'

invalid use of incomplete type 'struct Expression'

I looked a several previously posted questions but still, couldn't solve this problem. Thanks.

Answer

juanchopanza picture juanchopanza · Feb 20, 2013

You can't forward declare Expression because you need the full declaration for this:

Parameter() {
    string = new Token();
    identifier = new Token();
    expr = new Expression();  // here!
}

What you can do is move the implementation of the Parameter() constructor out of the header and into a .cpp file.