7

我目前正在尝试使用列表类私有的节点结构在列表模板类中实现排序算法。我正在使用一些私有递归函数,它们返回一个指向节点类型的指针,这会导致 g++ 给我一个声明错误。这是我所拥有的样本 -

template<class T>
class SList
{
private:
    struct NODE
    {
        T* elem;
        NODE* next;
    } *_head, *_tail;

NODE* sort(NODE* node);

public:
    //other declarations...

}

template<class T>
NODE* SList<T>::sort(NODE* node) //Error: 'NODE' does not name a type
{
    //sorting algorithm
}

这是 c++ 的限制还是我遗漏了什么?

4

3 回答 3

13

因为Node是一个内部类,你需要告诉编译器Node' 的定义来自哪里。

此外,Node 的定义会根据SList模板参数的不同而变化(它是依赖类型

所以你必须明确地Node这样引用:

template<class T>
typename SList<T>::NODE* SList<T>::sort(typename SList<T>::NODE* node) 
{
    //sorting algorithm
}
  • 请注意,typename因为 Node 是依赖类型(它取决于 的类型SList
  • 请注意,SList<T>::Node因为 Node 是依赖SList's 类型的类型。
于 2012-11-26T06:40:30.287 回答
2

下面工作正常:

template<class T>
typename SList<T>::NODE* SList<T>::sort(typename SList<T>::NODE* node)
^^^^^^^^^^^^^^^^^^^                     ^^^^^^^^^^^^^^^^^^^

这是 c++ 的限制吗

没有。因为可以在;NODE的范围之外命名任何结构/类型。SList<>所以实际上它是 C++ 为您提供的一种工具,您可以在不同的范围内拥有相同的名称类型。

“为什么我需要关键字typename”可以在这里找到。

于 2012-11-26T06:40:40.657 回答
1

您要引用的类型在 SList 中,因此您必须这样引用它:

template<class T>
typename SList<T>::NODE* SList<T>::sort(typename SList<T>::NODE* node);
于 2012-11-26T06:39:27.100 回答