0

主文件

#include "Test1.h"
#include "Test2.h"

int main(){  
    Test1 t1;
    Test2 t2;

    t1.process(t2);
    t2.process(t1);

} 

测试1.h

#ifndef TEST1
#define TEST1

#include "Test2.h"

class Test1 {
public:
    void process(const Test2& t) {};
};


#endif // !TEST1

测试2.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) 导致其中一个测试标头包含另一个作为空文件吗?

4

5 回答 5

3

如果您坚持这样做,您需要在每个 .h 文件中转发声明您的类,以便编译器知道它是什么。

#include "Test1.h"

class Test1;

class Test2 {
public:
    void process(const Test1& t) {};
};
于 2013-05-06T18:11:19.417 回答
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).

于 2013-05-06T18:12:39.040 回答
0

您需要将其中一个的前向声明放在另一个的标题中。如果您在 Test2.h 中转发声明 Test1(在声明 Test2 之前),您可以#include "Test1.h"从 Test2.h 中删除。

于 2013-05-06T18:11:31.300 回答
0

如果您在标头中有指向类型的引用或指针,请尝试使用前向声明。

// Within stop Test2.h
class Test1;
于 2013-05-06T18:11:58.543 回答
0

test1.h并且test2.h您可以使用前向声明Test2Test1分别避免包含。只需class Test1;替换#include "test1.h".

然后test1.h仅包含在实现文件中。

看到这个问题

于 2013-05-06T18:12:52.930 回答