我目前正在尝试使用列表类专用的节点结构在列表模板类中实现排序算法。我正在使用一些私有递归函数,它返回一个指向节点类型的指针,导致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 ++的限制还是我错过了什么?
答案 0 :(得分:11)
由于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
类型的依赖类型。答案 1 :(得分:2)
以下工作正常:
template<class T>
typename SList<T>::NODE* SList<T>::sort(typename SList<T>::NODE* node)
^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^
这是c ++的限制
否即可。因为NODE
范围之外可以有任何名为SList<>
的结构/类型;实际上它是一个工具,C ++为您提供了在不同范围内具有相同名称类型的地方。
“为什么我需要关键字typename
”可以找到here。
答案 2 :(得分:1)
您要引用的类型在SList中,因此您必须将其引用为:
template<class T>
typename SList<T>::NODE* SList<T>::sort(typename SList<T>::NODE* node);