繁体   English   中英

声明模板类中的结构,未定义成员函数

[英]Declaring a struct in a template class, undefined for member functions

我目前正在尝试使用列表类专用的节点结构在列表模板类中实现排序算法。 我正在使用一些私有递归函数,它返回一个指向节点类型的指针,导致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 ++的限制还是我错过了什么?

由于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类型的类型。

以下工作正常:

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

这是c ++的限制吗?

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

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

您要引用的类型在SList中,因此您必须将其引用为:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM