typename和class

来源:互联网 发布:淘宝卖中药材 编辑:程序博客网 时间:2024/06/09 15:48

在模版编程中,经常看到typename和class:

template<typename T>void print2nd( T& c){...}

template<classT>void print2nd( T& c){...}

上面这种情况,typename和class是完全一样的。

那么,什么时候必须使用typename而不是class?

template<typename C>void print2nd(const C& container){C::iterator iter(container.begin());    ...}
上面这个模版函数,我们的目的是处理容器,因而在里面使用容器的迭代器C::iterator iter,但是编译器并不知道C是什么东西,因此就不知道C::iterator 是什么了。C++有个规则可以解释这个状态:如果解析器在template中遭遇一个嵌套从属 名称,它就假设这个名称不是个类型,除非你告诉它。所以,我们必须明确告诉它这是个类型:

template<typename C>void print2nd(const C& container){typename C::iterator iter(container.begin());    ...}

只要在嵌套从属名称前面加上typename即可。


”typename必须作为嵌套从属类型名称的前缀词“ 这一规则的例外是,typename不可以出现在base class list内的嵌套从属类型名称之前,也不可以在member initialization list

中作为base class 的修饰符。例如:

template<typename T>class Derived :public Base<T>::Nested  //这里不能出现typename{public:explicit Derived(int x):Base<T>::Nested(x)   //这里不能出现typename{typename Base<T>::Nested temp; //这里必须出现typename        ...}    ...};


原创粉丝点击