循环类依赖:前向声明错误与#include错误("模板参数无效")

时间:2015-03-19 00:47:02

标签: c++ c++11 gcc windows-7 eclipse-cdt

编辑:对于将来发现此问题的任何人,以下阅读对我有很大帮助:http://www.umich.edu/~eecs381/handouts/IncompleteDeclarations.pdf

我有一个类,其头文件看起来大致像

#ifndef FOO_HPP_
#define FOO_HPP_

#include <memory>
#include "Bar.hpp"
using namespace std;

class Foo {

    shared_ptr<Bar>  bar;
    //other members omitted
};

#endif /* FOO_HPP_ */

我收到编译时错误:模板1无效(对于bar成员)。

Bar.hpp看起来大致如下:

#ifndef BAR_HPP_
#define BAR_HPP_

#include "Foo.hpp"
using namespace std;

class Bar {

//private and protected member omitted

public:
//other public members omitted
    virtual int collide(bool p, Foo& f) = 0;
};

#endif /* BAR_HPP_ */

如果我现在用#include "Bar.hpp"替换“Foo.hpp”中的class Bar;,CDT会在下面加上错误:“class Bar”的前向声明

如何解决此问题?

1 个答案:

答案 0 :(得分:1)

这个问题是因为bar.hpp使用的是foo.hpp而foo.hpp正在使用bar.hpp

要解决此问题,请将此内容写入foo.hpp并删除bar.hpp参考:

#ifndef FOO_HPP_
#define FOO_HPP_

#include <memory>
using namespace std;

class Bar; //<====== add this

class Foo {

    shared_ptr<Bar>  bar;
    //other members omitted
    void DoWork(); //<===== Function that does stuff to bar
};

#endif /* FOO_HPP_ */

在Foo.cpp

#include "Foo.hpp"
#include "Bar.hpp"

void Foo::DoWork()
{
     bar.Func();
}

在bar.hpp中:

#ifndef BAR_HPP_
#define BAR_HPP_

using namespace std;
class Foo; //<====== add this
class Bar {

//private and protected member omitted

public:
//other public members omitted
    void Func()
    {
        while(true); //Hang for debug
    };

    virtual int collide(bool p, Foo& f) = 0;
};

只要您使用引用类型(Foo *或Foo&amp;而不是直接使用Foo),这将导致链接时原型解析,这应该适合您。