Effective C++ 條款42
阿新 • • 發佈:2017-07-16
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