Search code examples
c++classvisual-studio-2015includeforward-declaration

C++ Simple circular reference and forward declaration issue


I get this error:

error C3646: 'bar': unknown override specifier

when trying to compile this very simple C++ code in Visual Studio 2015:

main.cpp:

#include "Foo.h"

int main ()
{
    return 0;
}

Foo.h:

#pragma once

#include "Bar.h"

class Foo
{
public:
    Foo();

    Bar bar;
};

Bar.h:

#pragma once

#include "Foo.h"

class Bar
{
public:
    Bar();
};

I get there is a circular reference because each .h includes the other, and the solution should be using forward declarations, but they don't seem to work, could someone explain why? I found similar problems here, and the solutions is always the same, I think I'm missing something :)


Solution

  • The circular reference is entirely of your own making, and you can safely remove it by removing the #include "Foo.h" from Bar.h:

    #pragma once
    
    //#include "Foo.h"  <---- not necessary, Bar does not depend on Foo
    
    class Bar
    {
    public:
        Bar();
    };
    

    You do not need a forward declaration of Bar inside Foo.h. A more general case would be if Foo and Bar were mutually dependent on each other, that would require forward declarations.