在看了几篇blog后自己琢磨了一下,明白typedef typename的作用了,先上一段自己编的代码:
template<class T>
class Test_1 {
public:
//...
typedef int size_type;
//...
private:
T data;
};
template<class T>
class Test_2 {
public:
//...
typedef typename Test_1<T>::size_type sz;//模板类型在实例化之前,编译器并不知道Test_1<T>::size_type是什么东西,所以告诉编译器Test_1<T>::size_type的类型是typename
//...
private:
T data;
};
int main()
{
Test_1<double>::size_type a1 = 1;
Test_2<double>::sz a2 = 1;
int a3 = 1;
//以上三句全部等价
system("pause");
return 0;
}
首先,可以看到,在Test_1的类中可以清晰的看到:
Test_1::size_type
是Test_1的嵌套类型定义,其实际等价于int
类型。
即:
Test_1<double>::size_type a;
//就等价于
int a;
为什么使用typename关键字
那么问题来了,在Test_2中为什么要加上typename
关键字?
即要写成这样:
typedef typename Test_1<T>::size_type sz;
而不是这样:
typedef Test_1<T>::size_type sz;//这样是会报错的!
实际上,模板类型在实例化之前,编译器并不知道Test_1<T>::size_type
是什么东西,事实上一共有三种可能:
静态数据成员
静态成员函数
嵌套类型
那么此时typename
的作用就在此时体现出来了——定义就不再模棱两可。typename
告诉编译器Test_1<T>::size_type
是一个嵌套类型而不是一个成员。