C++ typedef typename的作用

在看了几篇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是一个嵌套类型而不是一个成员。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值