Main.cpp的
#include "Test1.h"
#include "Test2.h"
int main(){
Test1 t1;
Test2 t2;
t1.process(t2);
t2.process(t1);
}
Test1.h
#ifndef TEST1
#define TEST1
#include "Test2.h"
class Test1 {
public:
void process(const Test2& t) {};
};
#endif // !TEST1
Test2.h
#ifndef TEST2
#define TEST2
#include "Test1.h"
class Test2 {
public:
void process(const Test1& t) {};
};
#endif // !TEST2
VS2012说:
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2143: syntax error : missing ',' before '&'
error C2664: 'Test2::process' : cannot convert parameter 1 from 'Test1' to 'const int'
我很确定循环包含问题(我偶尔会碰到它),但这次我不确定为什么不编译
注意:这些类只依赖于彼此的引用,这些引用具有已知的大小。是因为包含警戒(#ifndef
),使其中一个测试标题包含另一个作为空文件?
答案 0 :(得分:3)
如果你坚持这样做,你需要在每个.h文件中转发声明你的类,以便编译器知道它是什么。
#include "Test1.h"
class Test1;
class Test2 {
public:
void process(const Test1& t) {};
};
答案 1 :(得分:1)
完全展开预处理器指令,您将看到问题:Main.cpp包含Test1.h,其中包含Test2.h,因此在class Test2
定义之前,将首先编译Test1
,导致missing type specifier
错误。您可以通过向前声明Test1
并说出void process(const class Test1& t)
而不仅仅是void process(const Test1& t)
来解决此问题。
答案 2 :(得分:0)
您需要将其中一个的前向声明放在另一个的标题中。如果你在Test2.h中转发声明Test1(在声明Test2之前),你可以从Test2.h中删除#include "Test1.h"
。
答案 3 :(得分:0)
如果您有一个标题中的类型的引用或指针,请尝试使用前向声明。
// Within stop Test2.h
class Test1;
答案 4 :(得分:0)
在test1.h
和test2.h
中,您可以分别使用Test2
和Test1
的前向声明来避免包含。只需将class Test1;
代替#include "test1.h"
。
然后仅在实现文件中包含test1.h
。
请参阅此question