关于typename的用法,比较为大家所熟知的有一种:类模型引入的声明
template<typename T>
class Atype
{
}
还有另外一种,就是一种很特别的情况。
当使用模板类型中定义的类型时,该怎么办呢?可以使用关键字typename。
/*
从定义中可以说明 typedef typename T::value_type value_type; 这句话强调
我们定义了一种类型的变量 这种变量类型依赖于模板参数类型 模板类中一定定义了这样一种类型
*/
class AType {
public:
typedef int value_type;
};
template<class T>
class TSample {
typedef typename T::value_type value_type;
}
当使用TSample<AType>的时候,TSample的value_type就变成了AType::value_type。
当需要一个非实例化模板内部定义的类型时,就必须使用typename了。比如,定义一个模板类,这个类又使用了std::vector,
template<class T>
struct MyVector {
std::vector<T> vec;
typedef typename std::vector<T>::iterator;
};
为什么这样定义呢,C++默认就是将value_type解释为一个变量的。所以,为了和变量区分,必须使用typename告诉编译器这是一个类型。