关于c ++:在模板类中声明一个结构,未定义成员函数

Declaring a struct in a template class, undefined for member functions

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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++的限制还是我丢失了什么?


由于Node是一个内部类,您需要告诉编译器Node的定义来自何处。

此外,节点的定义根据SList的模板参数(它是一个依赖类型)而改变。

因此,您必须明确地将Node称为:

1
2
3
4
5
template<class T>
typename SList<T>::NODE* SList<T>::sort(typename SList<T>::NODE* node)
{
    //sorting algorithm
}
  • 注意typename,因为节点是依赖类型(取决于SList的类型)
  • 注意SList::Node,因为节点是依赖于SList类型的类型。

以下工作正常:

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

Is this a limitation of c++

没有。因为在EDCOX1的范围之外,可以有任何一个EDCOX1 0的结构/类型,实际上它是C++提供的工具,在那里你可以在不同的范围内拥有相同的名称类型。

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


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

1
2
template<class T>
typename SList<T>::NODE* SList<T>::sort(typename SList<T>::NODE* node);