2012-10-16 65 views
2

我有兩個類。每個都有一個指向另一個類的指針。所以我必須在其中之一中使用前向類聲明。這個方法運行良好,直到我需要使用帶有模板的函數(我必須在頭文件中寫入聲明和實現)。如何在模板函數中使用forward類聲明?

更具體地說,我的代碼就像下面的文件。這些文件通過MS Visual Studio 2010在Windows上沒有問題編譯。但是,當我在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; 
}  
+0

我得到了同樣的錯誤在Linux上。我們的程序應該能夠在所有平臺上運行,而不僅僅是Windows。 :( – redpearl

回答

2

你在你的函數定義,因爲你不包括classB.h沒有從一類稱爲訪問pB->iNum

Foward聲明可以幫助您定義類,然後可以包含頭文件。嘗試是這樣的:

#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

+0

太棒了!這個工程!非常感謝! – redpearl

+0

我的原始代碼也可以在Visual Studio中工作。C++的規範說了什麼?哪一個不遵循規範?Visual Studio或XCode? – redpearl

+0

我的錢在VS上。 .. – StoryTeller

相關問題