0

メイン.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) が原因で、Test ヘッダーの 1 つが他のヘッダーを空のファイルとしてインクルードするのですか?

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

プリプロセッサ ディレクティブを完全に展開すると問題が表示class Test2されTest1ますmissing type specifier。おそらくTest1void process(const class Test1& t)単にvoid process(const Test1& t).

于 2013-05-06T18:12:39.040 に答える
0

それらの一方の前方宣言を他方のヘッダーに入れる必要があります。Test2.h で Test1 を前方宣言すると (Test2 を宣言する前に)、Test2.h#include "Test1.h"から削除できます。

于 2013-05-06T18:11:31.300 に答える
0

ヘッダー内に型への参照またはポインターがある場合は、前方宣言を使用してみてください。

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

test1.htest2.hの前方宣言を使用してTest2、それぞれTest1インクルードを回避できます。class Test1;の代わりに置くだけです#include "test1.h"

次にtest1.h、実装ファイルのみに含めます。

この質問を参照してください

于 2013-05-06T18:12:52.930 に答える