我宣佈與具有默認參數的所有參數的模板類,例如模板:typedef的所有默認參數
template<typename TYPE = int>
class Foo {};
然後下面兩個是等價的:
Foo<int> one;
Foo<> two;
不過,我米不允許只是做:
Foo three;
是否有可能通過typedef
相同的名稱,但括號,就像這樣:
typedef Foo<> Foo;
我宣佈與具有默認參數的所有參數的模板類,例如模板:typedef的所有默認參數
template<typename TYPE = int>
class Foo {};
然後下面兩個是等價的:
Foo<int> one;
Foo<> two;
不過,我米不允許只是做:
Foo three;
是否有可能通過typedef
相同的名稱,但括號,就像這樣:
typedef Foo<> Foo;
如果聲明typedef Foo<> Foo;
是允許的,此後的名字 Foo
爲模板不能指定。 也就是說,以下內容無效。
template< template<class> class > struct A {...};
A<Foo> a; // error
雖然上述typedef
在實踐中不容許, 如果你仍然需要編寫Foo
作爲Foo<>
,像下面 宏將滿足的目的。
#define Foo Foo<>
不能重新聲明與不同類型的符號,因此你就可以做你希望將無法正常工作。 如果要實現這一點,使用不同的名稱,別名:
typedef Foo<> Foo_;
我像做以下,我不知道你是否喜歡還是不喜歡:
template<typename TYPE = int>
class basic_Foo {};
typedef basic_Foo<int> Foo;
不幸,否,因爲Foo
已經是類模板本身的名稱,因此不能是同一名稱空間中的任何其他名稱。
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;
}
號雖然可以使用相同的名稱聲明typedef
爲class
爲class
,因爲你可以使用一個typedef重新定義的名稱來指代它已經提到的類型。
typedef class A A;
,或者如果A
已經聲明爲類:
typedef A A;
你不能做到這一點與模板的名稱(模板的名稱是不是一類的名稱),你必須給它一個不同的名字。
typedef Foo<> Bar;
可能已經太晚了,但不要爲此使用define。這會在很多方面造成問題。你將永遠無法使用不同類型的foo。你永遠不能在另一個命名空間中使用foo。 – 2011-11-13 09:14:03