什么时候需要“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”关键字?
答案:
每当您引用嵌套名称时,“typename”关键字都是必需的模板类或函数,其中嵌套名称的类型在编译时未知。这称为“从属名称”。
在 C 中,实体分为三类:值、类型和模板。其中每一个都可以有名称,但名称本身并不表明该实体属于哪个类别。因此,编译器必须从上下文中推断实体类别。
当编译器无法推断类别时,您必须使用适当的关键字显式指定它:
在提供的代码中,嵌套名称“矢量
”是模板类中的一种类型。但是,编译器无法推断这一点,因为类型参数“K”在编译时未知。因此,需要“typename”关键字来显式指定“vector
”
必须指定“typename”的其他情况包括:
以上是C 模板中何时需要'typename”关键字?的详细内容。更多信息请关注PHP中文网其他相关文章!