2012-02-28 91 views
4

我環顧四周,我無法確定其他類似問題是否回答此問題。是否可以轉發聲明名稱空間內的typedef?

// lib.h 
namespace lib_namespace 
{ 
    struct lib_struct 
    { 
    typedef std::vector<LibObject> struct_value; 
    }; 

    typedef lib_struct::struct_value lib_value; // compiler points here 
}; 

// my.h 
// attempt at forward declaration 
namespace lib_namespace { class lib_value; }; 
... 

// my.cpp 
#include "lib.h" 

我得到一個重新定義編譯錯誤,這是可以理解的,但有沒有辦法來轉發聲明的typedef?

我的目的是避免添加lib.h作爲我正在創建的庫之外的依賴項。也許有更好的方法來實現這一目標?

編輯:爲了澄清,我試圖避免將額外的包含目錄行添加到所有項目文件,因爲我使用的是第三方庫而使用我創建的庫,上述情況是我被卡住了。因此,如果我在my.cpp中包含lib.h,但不包括my.h

回答

1

你編譯器抱怨,因爲lib.hmy.h是獨立的頭文件,他們不知道對方。此外,與實際的class不同,typedef不支持前向聲明。

假設您不想#include"lib.h",那麼您可以創建一個單獨的標題,其中包含typedef lib_struct::struct_value lib_value;以及與其相關的相關部分。 #include表示需要的新標題。

1

命名空間與問題無關。你不能轉發聲明typedef;只有實際的類型(類和結構)才能被聲明。

相關問題