我有两个类。每个类都有一个指向另一个类的指针。所以我必须在其中之一中使用前向类声明。这个方法运行良好,直到我需要使用带有模板的函数(我必须在头文件中编写声明和实现)。
更具体地说,我的代码类似于以下文件。这些文件在 Windows 上通过 MS Visual Studio 2010 编译没有问题。但是当我在 Mac 上通过 XCode 4.3.2 编译它们时,我在文件 ClassA.h 中收到“Member access into incomplete type 'ClassB'”错误。
谁能告诉我如何使其可以在 Mac 上使用 XCode 进行编译?
文件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;
}
最佳答案
您在函数定义中访问 pB->iNum
,由于您没有包含 classB.h
,因此 A 类无法识别该值。
前向声明可帮助您定义类,然后您可以包含头文件。尝试这样的事情:
#ifndef CLASS_A
#define CLASS_A
class ClassB;
class ClassA
{
public:
ClassA();
template <typename T>
void funcA(T *t);
int iNum;
ClassB *pB;
};
#include "ClassB.h"
template <typename T>
void ClassA::funcA(T *t)
{
iNum = *(int*)t;
iNum += pB->iNum;
}
#endif
并在classB.h
中执行相同的操作
关于c++ - 如何在带有模板的函数中使用前向类声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12924443/