2011-10-05 225 views

回答

6

typedef給出該類型的別名。

typedef Some :: Nested :: Namespace :: TypeName TypeName;

一旦你這樣做了,只需在本地命名空間中說TypeName就可以引用Some::Nested::Namespace::TypeName


using declaration使得該類型在當前命名空間中可見。

using Some :: Nested :: Namespace :: TypeName;

在當前名稱空間中導入該類型。

在這種情況下,使用上述任意一種,只需在本地名稱空間中使用TypeName即可引用Some::Nested::Namespace::TypeName

+2

雖然有真正的區別嗎?尤其是考慮到C++ 11'using'語句的提升,它允許定義模板別名。 –

+0

至少模板類型有一個區別。你只能'typedef'一個專門的類型,比如'vector ',並且你可以只在非專用模板上使用'using'(例如'vector') – jalf

+0

如果你有一堆你想要的重載操作符import,'typedef'在這種情況下不起作用,因爲你必須使用'using'! – AraK

6

使用只是將聲明帶入本地範圍,而typedef引入typedef名稱。它們之間的一個區別是詳盡的類型說明符,例如:

 

namespace n 
{ 
    class foo 
    { 
    }; 
} 

typedef n::foo n_foo; 

using n::foo; 

int main() 
{ 
    class foo f1; // ok, declares f1 variable of type n::foo. 
    class n_foo f2; // error, typedef-name can't be used in elaborated-type-specifier. 
} 
 
6

它們具有不同的來源和不同的用途。


typedef來自C:記得,在C方式來聲明一個結構是:

typedef struct _MyStruct { .... } MyStruct; 

它可以讓你引入一個別名的類型只。它可以用於函數的類型,有一個尷尬的語法...

typedef void (*Func)(Foo, Bar); 

哪裏Func現在是一個指針,通過複製以兩個參數(分別爲類型FooBar)功能,並返回什麼。


using最初有不同的含義。它是爲了向一個範圍注入一個名字。任何名稱(幾乎)都可以注入:類型,函數,變量(但不是枚舉值...)

用C++ 11,語法已增強,以允許模板混疊:

template <typename T> 
using equiv_map = std::map<T,T>; 

此加電using意味着混疊(見下文)現在是可能的,前一功能的頂。


此C++ 11更改是語法協調的明確方向。注意別名的定義如何,現在類似變量的定義:

<name> = <expression>; 

不幸的是它似乎是標準保留了這個別名到模板的情況,所以現在都 typedefusing並存,各有各的狩獵場。

+0

你的意思是你的最後一段'using name = int;'在C++ 11中不是格式良好的嗎? – dyp

+0

@DyP:這就是我的意思,雖然我不記得爲什麼,因爲它確實工作(並且對於函數引用/指針非常方便)。我不知道我是否被早期版本的gcc/clang燒燬。 –

相關問題