1. 程式人生 > >Effective C++ 條款42

Effective C++ 條款42

out javascrip 什麽 temp roc clu this 程序猿 turn

本節條款我們討論一下class 關鍵字和typename關鍵字的不同以及對於模板函數(template function)的影響。


例如以下代碼:

template<class T>
T getValue1(T m)
{
    return m * 2;
}

template<typename T>
T getValue2(T m)
{
    return m * 2;
}

在上面代碼中。class和typename的作用是一樣的。沒有不論什麽區別。所以程序猿在聲明模板時能夠依據個人習慣使用class或者typename。

只是在有些時候卻僅僅能用typename而不能用class。

例如以下代碼:

#include<iostream>
using namespace std;

class Defalut
{
public:
    typedef int a;

};

template<typename T>
int getValue(T m)
{
    typename T::a a1;//假設不用typename編譯出錯
    a1 = 0;
    return a1;
}

int main()
{
    Defalut d;
    cout<<getValue(d);
    return 0;

}

C++規定上面的凝視行僅僅能加typename,不能加class
為什麽不加typename程序會出錯,我們如今來設想一下,例如以下對照代碼形式:

class Defalut
{
public:
    typedef int a;

};


class Defalut
{
public:
    static int a;

};

Defalut::a;

我們如今看一下,對照同名的兩個類的調用Defalut::a,一個返回類型int,還有一個返回整型值。
那麽就是說在模板中要對T::a推斷是返回值還是類型。對於C++而言。沒加前置關鍵字typename覺得是返回值。如T::a,覺得返回一個static的值。

加了typename關鍵字覺得是返回類型,如typename T::a。覺得返回一個嵌套類型。
嵌套類型是指class類中或其它結構中定義的類型。

Effective C++ 條款42