循环 class 依赖项:前向声明错误与 #include 错误 ("template argument invalid")

Circular class dependencies: Forward declaration error vs. #include error ("template argument invalid")

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

我有一个class,它的头文件看起来大概像

#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_ */

如果我现在将 "Foo.hpp" 中的 #include "Bar.hpp" 替换为 class Bar;,CDT 将在其下划线显示错误:前向声明 'class Bar'

我该如何解决这个问题?

这个问题是因为 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& 而不是直接使用 Foo),这将导致 link 时间原型解析,这应该适合您。