私は2つのクラスを持っています。それぞれに、他のクラスを指すポインターがあります。そのため、そのうちの 1 つで前方クラス宣言を使用する必要があります。このメソッドは、テンプレートで関数を使用する必要があるまでは問題なく動作します (ヘッダー ファイルに宣言と実装の両方を記述する必要があります)。
より具体的には、私のコードは次のファイルのようなものです。これらのファイルは、Windows では MS Visual Studio 2010 によって問題なくコンパイルされました。しかし、XCode 4.3.2 によって Mac でコンパイルすると、ファイル ClassA.h で「不完全な型 'ClassB' へのメンバー アクセス」のエラーが発生しました。
XCodeを使用してMacでコンパイルできるようにする方法を誰か教えてもらえますか?
ファイル ClassA.h
#ifndef CLASS_A
#define CLASS_A
//#include "ClassB.h"
class ClassB;
class ClassA
{
public:
ClassA();
template <typename T>
void funcA(T *t);
int iNum;
ClassB *pB;
};
template <typename T>
void ClassA::funcA(T *t)
{
iNum = *(int*)t;
iNum += pB->iNum;
}
#endif
ファイル ClassA.cpp
#include "ClassA.h"
ClassA::ClassA()
{
iNum = 1;
}
ファイル ClassB.h
#ifndef CLASS_B
#define CLASS_B
#include "ClassA.h"
class ClassB
{
public:
ClassB();
template <typename T>
void funcB(T *t);
int iNum;
ClassA *pA;
};
template <typename T>
void ClassB::funcB(T *t)
{
iNum = *(int*)t;
iNum -= pA->iNum;
}
#endif
ファイル ClassB.cpp
#include "ClassB.h"
ClassB::ClassB()
{
iNum = 2;
}
メインファイル
#include <stdio.h>
#include "ClassA.h"
#include "ClassB.h"
int main(void)
{
ClassA objA;
ClassB objB;
objA.pB = &objB;
objB.pA = &objA;
int a = 11;
int b = 22;
objA.funcA(&a);
objB.funcB(&b);
printf("Class A: %d, %d\n", objA.iNum, objA.pB->iNum);
printf("Class B: %d, %d\n", objB.iNum, objB.pA->iNum);
return 0;
}