在 t下面 template 声明式中,class 和 typename 意义完全相同。
template <class T> class Widget;
template <typename T> class WIdget; 然而 C++ 并不总是把 class 和 typename 视为等价。 有时候,我们一定得使用typename。
一般来说,在缺省状态下,C++解析器认为在 template 中的嵌套从属名称是个变量,而不是个类型。
如果要告诉解析器,T::const_iterator 是一个类型,只需要在它之前加一个关键字: typename即可。
如:
template <typename T>
void Func(const T& container)
{
	typename T::const_iterator iter;
        // ... ...
} 但是,“template 必须作为嵌套从属类型名称的前缀词”也是有例外的。
typename 不可以出现在 base classes list内的嵌套从属类型名称之前,
也不可以出现在member initialization list中作为base class修饰符。
例如:
template <typename T>
class Derived : public Base<T>::Nested // base classes list 不允许 “typename”.
{
public:
	explicit Derived(int x)
	: Base<T>::Nested(x) //不可以出现在member initialization list中作为base class修饰符
	{
		typename Base<T>::Nested temp;
		//... ...
	}
	//... ...
}; 
京公网安备 11010502036488号