2011-10-05 74 views
2

我有一個大型的軟件框架,目前生活在一個通用的命名空間。最近,我將一些類移入嵌套的名稱空間,但爲了暫時保持向後兼容性,我需要將名稱保留在全局名稱空間中。到目前爲止,我使用using從嵌套命名空間注入類型:Typedef或使用?

namespace framework { 
    namespace IO { 
    struct IStream; 
    } 
#if COMPATIBILITY 
using IO::IStream; 
#endif 
} 

但是,我同樣可以使用typedef IO::IStream IStream;。使用typedef而不是using有什麼優勢/劣勢?

+0

但要小心AD''used'_函數重載;使用非類型可能不完全按照你的想法(http://stackoverflow.com/questions/2953684/why-doesnt-adl-find-function-templates) – sehe

+0

可能的重複[有什麼區別typedef和使用?](http://stackoverflow.com/questions/7657710/what-are-the-differences-between-typedef-and-using) –

回答

4

它們有些不同:typedef引入了一個新類型名稱framework::IStream,而using指令隻影響它所在範圍內的名稱查找。 (這有額外的效果,如果你要定義一個獨立的,真正的類型framework::IStream,但因爲你不這樣做,這不是一個問題。)

在這個意義上我會說,using是一個實現細節,它比通過引入新類型名稱而產生的全局語義變化更可取。因此,如果您可以避開它,請在需要的範圍內使用using指令,然後逐漸將這些指令遷移到新系統。

+0

'typedef'不會創建新的類型。它會創建別名,並且編譯器在typedef中鍵入的「源」和「目標」之間沒有任何區別。 – n0rd

+2

@ n0rd:我將它改爲「type name」。 –

相關問題