首页 > 代码库 > Effective C++ 条款42
Effective C++ 条款42
本节条款我们讨论一下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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。