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++的限制还是我丢失了什么?
由于
此外,节点的定义根据
因此,您必须明确地将
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++提供的工具,在那里你可以在不同的范围内拥有相同的名称类型。
这里可以找到"为什么我需要关键字
您要引用的类型在slist中,因此您必须这样引用它:
1 2 | template<class T> typename SList<T>::NODE* SList<T>::sort(typename SList<T>::NODE* node); |