typename和class

本文深入探讨了C++中typename和class关键字在模板定义中的作用与区别,特别是它们在处理泛型编程中二义性问题的应用。通过具体编程实验,展示了如何正确使用typename关键字来明确指定类型,避免代码中的歧义。

文章目录

1 typename和class

下面的程序想表达什么意思?
在这里插入图片描述

历史上的原因:

  • 早期的C++直接复用class关键字来定义模板。
  • 但是泛型编程针对的不只是类类型。
  • class关键字的复用使得代码出现二义性。

typename诞生的直接诱因:

  • 自定义类类型内部的嵌套类型。
  • 不同类中的同一个标识符可能导致二义性。
  • 编译器无法辨识标识符究竟是什么。

编程实验:模板中的二义性

#include <iostream>
#include <string>

using namespace std;

template < class T >
class Test
{
public:
    Test(T t) 
    { 
        cout << "t = " << t << endl;
    }
};

template < class T >
void func(T a[], int len)
{
    for(int i=0; i<len; i++)
    {
        cout << a[i] << endl;
    }
}


//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////

int a = 0;

class Test_1
{
public:
    static const int TS = 1;
};

class Test_2
{
public:
    struct TS
    {
        int value;
    };
};

template
< class T >
void test_class()
{
    typename T::TS * a;        // 1. 通过泛指类型 T 内部的数据类型 TS 定义指针变量 a (推荐的解读方式)
                               // 2. 使用泛指类型 T 内部的静态成员变量 TS 与全局变量 a 进行乘法操作
                               // 不加typename是第二种情况
}


int main(int argc, char *argv[])
{
    // test_class<Test_1>();
    test_class<Test_2>();
    
    return 0;
}


typename的作用:

  1. 在模板定义中声明泛指类型。
  2. 明确告诉编译器其后的标识符为类型。

参考资料:

  1. C++深度解析教程
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值