C++模板中的typename的兩種用法
阿新 • • 發佈:2019-01-22
在模板引數中,typename與class的使用是一樣,如:
template<typename T>
class A{};
template<class T>
class A{};
上面兩段程式碼含義是一樣的。
typename的第二個作用是用來指定相應名稱為型別。
當模板中出現typedef,而typedef的內容還依賴於模板引數時,必須要指定——T::bs是一個型別(而不是一個變數)——如下程式碼編譯器會報錯:
template<typename T>
class Temp
{
public:
/*此處將報錯,因為編譯器不確定T::bs是一個型別還是一個成員變數,
而typedef只能作用於型別。*/
typedef T::bs _bs;
};
於是要在T::bs前面加上typename關鍵字:
template<typename T>
class Temp
{
public:
typedef typename T::bs _bs;
};
題外:
上述的所謂“依賴於模板引數”,是由於C++模板標準規定了“Two-Phase Name Lookup”,即模板中有兩種型別的名稱(Name),一種是 “非依賴性名稱(Non-dependent names)”,即在模板定義時就能確定的名稱;另一種是“依賴性名稱(Dependent names)”,即要等到模板例項化時才能確定的名稱。如下例:
class A
{
class B
{
};
};
template<typename T>
class Temp
{
public:
/*A::B是已經確定的名稱,不依賴於模板引數T*/
typedef A::B A_B;
/*由於模板定義時不知道T::bs是T的成員型別還是成員變數,
其依賴於模板Temp例項化時傳入的引數T,所以是依賴性名稱,
編譯器會強制要求在前面加上typename。*/
typedef typename T::bs T_bs;
};