• 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类中或其它结构中定义的类型。

  • 相关阅读:
    asp.net 学习连接
    学习笔记一
    windows 2008 r2 AD密码策略
    Windows Server 2008 R2之活动目录回收站
    用java 调用 .net 自定义的 Soap WEB Service
    昆明赶街时间
    Windows Server 2008 R2 AD的备份和恢复
    AD 自定义属性
    AD、IIS、asp.net
    wsgen与wsimport命令说明
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7190369.html
Copyright © 2020-2023  润新知