typename的常见用法
#include <iostream> template <typename T> T AddFunc(const T& a, const T& b) { return (a + b); } int main() { std::cout << AddFunc(10, 20) << std::endl; return 0; }
在上述的示例中,typename与class的作用是一致的,换句话说可以使用class替换typename。
在C++标准化过程中,引入关键字typename是为了说明:在模板内部的标志符可以是一个类型,如下述示例:
template <typename T> class MyClass { typename T::SubType* ptr; ... };
上面的示例中,内部的typename被用来说明SubType是定义于类T内部的一种类型,因此,ptr是一个执行T::SubType类型的指针,如果不使用typename,SubType就会被认为是一个静态成员,那么它应该是一个具体的变量或对象。于是T::SubType*ptr会被看作是类T的静态成员SubType和ptr的乘积,通常而言,当某个依赖于模板参数的名称是一个类型时,就应该使用typename。
参考:https://feihu.me/blog/2014/the-origin-and-usage-of-typename/