循环 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 时间原型解析,这应该适合您。
编辑:对于以后发现这个问题的任何人,以下阅读对我帮助很大: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 时间原型解析,这应该适合您。