条款42:了解typename的双重意义

本文探讨了C++中typename关键字的双重含义及其在模板编程中的应用,特别是如何正确处理嵌套从属名称,避免解析歧义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*条款42:了解typename的双重意义*/
#include<iostream>
using namespace std;
template<typename C>
void print2nd(const C&container) {//打印容器中的第二个元素
	if (container.size() >= 2) {//模板内出现的名称如果相依于某个模板参数,称之为“从属名称”,如果从属名称在类内呈嵌套状,则称之为嵌套从属名称
		C::const_iterator iter/*嵌套从属名称()*/(container.begin());//所以这个名称被假设为非类型,那么我真的需要让编译器知道它是怎么办?如下
		typename C::const_iterator iter1(container.begin());
		++iter;
		int/*int 为非从属名称*/ value = *iter;
		cout << value;
		//嵌套从属名称有可能导致解析(parsing)困难
		C::const_iterator*x;//我们知道的C::const_iterator是个类型,这样没有问题,如果C有个静态成员变量而碰巧与被命名为const_iterator,而且x碰巧是个这个域的局部变量呢?那就是相乘的关系
		//所以当编译器开始解析模板print2nd时,尚未确知C是什么东西,C++有个规则可以解析此一歧义,如果解析器在模板中遭遇一个嵌套从属名称,它便假设这个名称不是类型,除非你告诉它是,所以缺省情况下嵌套从属名称不是类型,此规则有个例外
	}
}
template<typename C>
void f(const C&container,//不允许使用typename(C并不是嵌套 从属类型名称,解释是它并非嵌套于任何“取决于模板参数的东西内”)
	typename C::iterator iter);//一定要使用typename
//“typename必须作为嵌套从属类型名称的前缀词”这一规则的例外是,它不可以出现在 base classes list 内的嵌套从属类型名称之前,也不可在member initialization list 中作为基类的修饰符
template<typename T>
class Derived :public Base<T>::Nested {//base class list 中不允许有typename
		typename Base<T>::Nested temp;
public:
	explicit Derived(int x):Base<T>::Nested(x) {//mem init list 中不允许有typename嵌套人性类型名称
	}
};
//-----------
template<typename IterT>
void workWithIterator(IterT iter) {
	//typename iterator_traits<IterT>::value_type temp(*iter);//为这个迭代器指涉的对象做一份local复件temp
	typedef typename iterator_traits<ITerT>::value_type value_type;
	value_type temp(*iter);//上面的typedef版本
}
int main() {

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值