c++ - 如何在带有模板的函数中使用前向类声明?

标签 c++ templates

我有两个类。每个类都有一个指向另一个类的指针。所以我必须在其中之一中使用前向类声明。这个方法运行良好,直到我需要使用带有模板的函数(我必须在头文件中编写声明和实现)。

更具体地说,我的代码类似于以下文件。这些文件在 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/

相关文章:

c++ - OS10.7 中的__MWERKS__ 在哪里?

c++ - 如何为 lambda 创建唯一类型?

c++ - 代码可以编译,但是不起作用! cmd窗口正处于理想状态,但没有任何反应

c++ - 为什么 C++ 编译器可以将函数声明为 constexpr,而不能是 constexpr?

c++ - 在实例上调用时未找到模板类中的模板成员函数

java - 对 CXF 服务器的 C/C++ SSL 请求

c++ - 如何在 double 中存储 chrono 的时间?

c++ - 是否可以声明模板的模板?

C++1y/C++14 : Variable Template Specialization?

c++ - 在没有参数列表的情况下无效使用模板名称