typename的用法
1、typename关键字有3个主要用途:
(1)在模板中声明一个参数类型;
(2)用于告诉编译器一个嵌套的类型,而不是静态成员;
(3)模板模板参数时使用,作为类型暂定说明(C++17后使用)。
2、什么是嵌套的类型(或叫嵌套的限定符):在模板编程中,当一个模板参数内部有嵌套的类型时,我们使用作用域运算符::来访问这个嵌套的类型,之所以这样做,是因为当访问类的静态成员变量时,也使用类型::静态成员变量,为了让编译器区分两者,在类型::嵌套的类型前加typename,如:下图,T::const_iterator是一个模板类型以内的类型,而不是静态成员,因此使用typename说明。
template<typename T> void printAll(const T& container) { typename T::const_iterator it = container.begin(); for(;it != container.end(); ++it) { //打印元素 } }3、模板模板参数的语法:
template<typename T,template<typename,typename> class Container>
第一个typename表示参数类型;
template<typename,typename> class Container表示接受2个类型参数的模板
template<typename T,template<typename typename = std::allocator<T>> class Container>
第一个typename表示参数类型;
template<typename,typename = std::allocator<T>> class Container表示有默认参数的模板
4、为了避免模板模板参数过长,可以使用using来创建类型别名,比如
using myType = typename Container::value_type;(所有的容器当中,都有一个value_type表示容器元素类型,也是模板传入的类型)。
template<typename T> class MyClass { using TypeAlias = T; };