C ++ - 使用typename和模板错误

时间:2014-01-02 19:23:37

标签: c++ templates typename

我使用模板类构建了一个双向链表,我构建的类包含内部公共类 linkedListNode ,其中包含私有字段 next previous 。 对于封装问题,我想定义一个返回下一个节点的方法

template <class T>
MyLinkedList<T>::MyLinkedListNode* MyLinkedList<T>::MyLinkedListNode::getNext()
{
    return this -> next;
}

但这是一个编译错误。 我也尝试使用typename,它也是一个编译错误

补偿错误是:

  

在'MyLinkedList :: MyLinkedListNode'之前需要'typename'因为   'MyLinkedList'是一个依赖范围

3 个答案:

答案 0 :(得分:3)

正如编译器告诉你的那样:

  

在'MyLinkedList :: MyLinkedListNode'之前需要'typename',因为'MyLinkedList'是一个依赖范围

您应该使用typename,因为MyLinkedList<T>::MyLinkedListNode*是一个从属名称(它取决于模板参数T)。您可以使用以下命令修复代码:

template <class T>
typename MyLinkedList<T>::MyLinkedListNode* MyLinkedList<T>::MyLinkedListNode::getNext()
{
    return this->next;
}

作为you can see,它的工作正常。

答案 1 :(得分:2)

实例化MyLinkedList<T>时,它有可能是值而不是类型。要使编译器知道它是一种类型,需要typename关键字。对于从属名称,编译器不做任何假设。程序员可以将typenametemplate个关键字放在正确的位置。幸运的是,它在错误信息中是正确的。它不能比这更容易。

答案 2 :(得分:1)

您的编译器告诉您解决方案:

template <class T>
typename MyLinkedList<T>::MyLinkedListNode* MyLinkedList<T>::MyLinkedListNode::getNext()
{
    return this -> next;
}