本节条款我们讨论一下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类中或其他结构中定义的类型。
原文地址:http://blog.csdn.net/u011058765/article/details/46359177