码迷,mamicode.com
首页 > 编程语言 > 详细

Effective C++ 条款43

时间:2015-06-04 13:50:19      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:模板   template   typename   

本节条款我们讨论一下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++ 条款43

标签:模板   template   typename   

原文地址:http://blog.csdn.net/u011058765/article/details/46359177

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!