template <typename dataType>
**typename** List<dataType>::Node* List<dataType>::find(int index){
Node *cur = head;
for(int i = 0; i < index; i++){
cur = cur->next;
}
return cur;
}
如果我不使用它,则会出现以下错误:
need ‘typename’ before ‘List<dataType>::Node’ because ‘List<dataType>’ is a dependent scope
因此,我阅读了Wiki条目,但没有得到该特定示例背后的原因。
因为,如错误消息所示,它List<dataType>::Node
是一个从属名称,即依赖于模板参数的名称。假设您有这样的事情:
struct A {
typedef float t;
};
struct B {
static int t;
};
template <typename T>
void func()
{
T::t * x; // pointer declaration, or multiplication? It depends...
}
在这里,A::t
和B::t
都是有效的C ++表达式,但含义完全不同:第一个是类型,第二个是值。现在,当编译器首次解析模板函数时func()
-在进行任何类型替换之前检查其语法是否正确-它必须尝试确定T::t * x
含义。显然,有两种可能的方法来解析它,因此编译器必须决定采用哪种方法。
在某些情况下,编译器有足够的“上下文”来确定您是否在引用类型,但是在许多情况下(例如本示例),编译器没有。当无法确定时,它假定您正在谈论一个值-因此上述内容(希望)为您提供了有关变量x
未知的错误。如果要T::t
被视为类型,则需要使用typename
关键字明确地告诉它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句