2011-06-11 51 views
6

我宣佈與具有默認參數的所有參數的模板類,例如模板:typedef的所有默認參數

template<typename TYPE = int> 
class Foo {}; 

然後下面兩個是等價的:

Foo<int> one; 
Foo<> two; 

不過,我米不允許只是做:

Foo three; 

是否有可能通過typedef相同的名稱,但括號,就像這樣:

typedef Foo<> Foo; 

回答

1

如果聲明typedef Foo<> Foo;是允許的,此後的名字 Foo爲模板不能指定。 也就是說,以下內容無效。

template< template<class> class > struct A {...}; 
A<Foo> a; // error 

雖然上述typedef在實踐中不容許, 如果你仍然需要編寫Foo作爲Foo<>,像下面 宏將滿足的目的。

#define Foo Foo<> 
+3

可能已經太晚了,但不要爲此使用define。這會在很多方面造成問題。你將永遠無法使用不同類型的foo。你永遠不能在另一個命名空間中使用foo。 – 2011-11-13 09:14:03

2

不能重新聲明與不同類型的符號,因此你就可以做你希望將無法正常工作。 如果要實現這一點,使用不同的名稱,別名:

typedef Foo<> Foo_; 
7

我像做以下,我不知道你是否喜歡還是不喜歡:

template<typename TYPE = int> 
class basic_Foo {}; 

typedef basic_Foo<int> Foo; 
+4

又名「stdlib方法」。 :) – Xeo 2011-06-11 15:17:40

+1

是的,'basic_string'和朋友發生同樣的事情:) – rubenvb 2011-06-11 15:18:56

+0

所以,如果'basic_Foo '比其他任何'basic_Foo '都多使用'我問的原因是因爲它看起來像添加到類名稱的字符數量過多,而不是:'typedef Foo Foo_int'或類似的東西。 – 2011-06-11 15:32:08

0

不幸,否,因爲Foo已經是類模板本身的名稱,因此不能是同一名稱空間中的任何其他名稱。

1
typedef Foo<> Foo; 

給出:

prog.cpp:4: error: ‘typedef class Foo<int> Foo’ redeclared as different kind of symbol 
prog.cpp:2: error: previous declaration of ‘template<class TYPE> class Foo’ 

錯誤相當多告訴是什麼問題。編譯器將Foo視爲正在重新聲明。

然而,這應當編制和工作:

template<typename TYPE = int> class Foo {}; 

typedef Foo<> FooClone; 

int main() 
{ 
    Foo<int> one; 
    Foo<> two; 
    FooClone three; 

    return 0; 
} 
1

號雖然可以使用相同的名稱聲明typedefclassclass,因爲你可以使用一個typedef重新定義的名稱來指代它已經提到的類型。

typedef class A A; 

,或者如果A已經聲明爲類:

typedef A A; 

你不能做到這一點與模板的名稱(模板的名稱是不是一類的名稱),你必須給它一個不同的名字。

typedef Foo<> Bar;