首页 > 代码库 > 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类中或其它结构中定义的类型。

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

Effective C++ 条款42