文章目录
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的作用:
- 在模板定义中声明泛指类型。
- 明确告诉编译器其后的标识符为类型。
参考资料:
本文深入探讨了C++中typename和class关键字在模板定义中的作用与区别,特别是它们在处理泛型编程中二义性问题的应用。通过具体编程实验,展示了如何正确使用typename关键字来明确指定类型,避免代码中的歧义。
1381

被折叠的 条评论
为什么被折叠?



