1. 程式人生 > >C++模板中的typename的兩種用法

C++模板中的typename的兩種用法

在模板引數中,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;
};