2014-03-31 46 views
0

我有一个名为node的类,它是另一个模板化的类。类节点的一些方法返回节点指针。这是我如何实现需要输入名称错误(与模板相关的错误)

template <typename T> 
class myClass{ 
.... 
    class Node{ 
     Node* getNodePointer(); 
     ... 
    } 
}  
... 
template <typename T> 
myClass<T>::Node* myClass<T>::Node::getNext() 
{ return next; } 

当我编译上面的代码的摘录,我得到这个错误“myClass.h:138:1:错误:前需‘类型名称’‘MyClass的::节点’,因为“MyClass的'是一个依赖范围“。我该如何解决这个问题?非常感谢

+0

'typename myClass :: Node * myClass :: Node :: getNext()'。请注意'typename'在开头。 – SirGuy

+0

[This](http://stackoverflow.com/questions/610245/where-and-why-do-i-have-to-put-the-template-and-typename-keywords?rq=1)处理**为什么**。 –

+0

非常感谢你们! – user3273345

回答

1

How do I fix this problem?

编译器的错误信息是关于这一点相当清楚:
使用嵌套class ES,struct S或typedef initions从模板类,你需要添加typename关键字来告诉你,你的编译器使用它作为一种类型:

template <typename T> 
    typename myClass<T>::Node* myClass<T>::Node::getNext() { // ... 
// ^^^^^^^^ << Add typename keyword 
2

为了澄清,编译器不知道myClass<T>::Node现在或将永远是一个类型。想想这样说:

template <typename T> 
class A 
{ 
public: 
    typedef T value_type; 
}; 

template <typename T> 
class B 
{ 
public: 
    typename A<T>::value_type x; 
}; 

template <> A<int> { public: static int value_type=10;} 

你必须作出承诺,编译器类型为类型名。它默认假设它是一个值。

+0

+1对于额外的解释和示例。 –

+0

感谢您的解释! – user3273345