为什么需要“typename”关键字?
在编程中,通常使用嵌套名称,其中一个实体的名称 (例如,一个类)包含在另一个实体(例如,成员函数)的名称中。虽然这种嵌套通常足以区分正在引用哪个实体,但在某些情况下,编译器需要显式指定。
“typename”关键字的解释
“typename” " 关键字用于显式声明嵌套名称引用类型。当编译器无法从上下文推断嵌套名称的类型时,这是必要的。这样的嵌套名称称为“依赖名称”。
当在具有未知参数的模板实例中使用嵌套名称时,该嵌套名称将变得依赖。在这种情况下,编译器没有足够的信息来确定嵌套名称的具体类型,直到模板参数已知为止。
示例
考虑以下代码:
template<class K> class C { struct P {}; vector<P> vec; void f(); }; template<class K> void C<K>::f() { typename vector<P>::iterator p = vec.begin(); }
在这个例子中,“typename”关键字是必要的,因为“iterator”嵌套名称依赖于模板参数“K”。如果没有“typename”关键字,编译器将不知道“iterator”引用类型“vector
::iterator”。
其他需要“typename”的情况
除了上面的例子,其他需要“typename”的情况包括:
以上是C 模板中何时需要'typename”关键字?的详细内容。更多信息请关注PHP中文网其他相关文章!