2012-01-25 55 views
0

我試圖幫助同事獲得編譯的東西 - 實質上,他試圖減少我們需要從一個更大的軟件系統製作的小型可執行文件的依賴關係。編譯問題 - typedefs,前向聲明,命名空間?

我不知道我能完全說明問題,因爲我不完全理解它......但我要告訴這是怎麼回事就在這裏:

圖書館答:  文件:阿

namespace CF { 
    typedef sometype B; 
}; 

庫C:  文件章

//Forward declare Class 
class CF::B; 

Class D { 
    public: 
     B* UseB(); 
}; 

庫C:  文件C.cpp

#include "C.h" 
#include "A.h" 
using CF::B; 

B* D::UseB() 
{ 
    return new B; 
} 

對不起,我知道這看起來有點瘋狂,但我試圖從集合我們實際處理的文件簡化它。

我們通常會在CF :: B上得到多重定義錯誤,或者當我們玩弄代碼並改變它時,有時在CPP文件中,它只是無法識別CF :: B的類型。

我想我的第一個問題是......我可以像我們嘗試過的那樣聲明typedef,或者有其他方法來處理B是CF命名空間中的typedef的事實,而且我們不需要希望它直接包含在Ch文件中?

+0

標題是否有適當的包括守衛? –

+0

是的,他們都有標準的包容衛士(#ifndef #define #endif)。 –

+0

如何轉發從另一個文件中聲明typedef,以便在頭文件中沒有依賴項?這可能是一個好的第一步。 –

回答

1

預先聲明會更喜歡

namespace CF { class B; } 

編譯器不能做出什麼出格的CF::B除非它已經知道CF是一個命名空間。

您也無法轉發聲明typedef,因爲編譯器必須知道B是類還是內置類型。一些內置的類型有特殊規則,如char*void*

+0

這不是一個完整的解決方案,但它提高了構建的距離,所以我們取得了更多進展 - 所以我認爲這絕對是最好的,我會得到sl question的問題:)非常感謝你的幫助! +1。 –

2

這可能會幫助您:

啊:

#ifndef NAMESPACE_A 
#define NAMESPACE_A 

namespace A 
{ 
    class B 
    { 
     public: int i; 
    }; 
} 
#endif 

CH:

#ifndef NAMESPACE_A 
#define NAMESPACE_A 
namespace A 
{ 
    class B; 
} 
#endif 

class D 
{ 
    public: 
     A::B* UseB(); 
}; 

main.cpp中:

#include "a.h" 
#include "c.h" 
using A::B; 

B* D::UseB() 
{ 
    return new B(); 
} 

int main(int argc, char* argv[]) 
{ 
    D* d = new D(); 
    B* b = d->UseB(); 
    b->i = 1; 
    return 0; 
} 

...工作正常,我;)

+0

我認爲'CF :: B'是一個typedef而不是類定義的事實對於題... – ildjarn

+0

+1並感謝您的幫助 - 我會更加關注您指定的命名空間:) –