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

C++ 在模板类中声明结构,未定义成员函数,c++,templates,struct,C++,Templates,Struct,我目前正在尝试使用列表类专用的节点结构在列表模板类中实现排序算法。我正在使用一些私有递归函数,它们返回指向节点类型的指针,这会导致g++给我一个声明错误。这是我的一个样本- template<class T> class SList { private: struct NODE { T* elem; NODE* next; } *_head, *_tail; NODE* sort(NODE* node); public:

我目前正在尝试使用列表类专用的节点结构在列表模板类中实现排序算法。我正在使用一些私有递归函数,它们返回指向节点类型的指针,这会导致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
}
模板
班级名单
{
私人:
结构节点
{
T*elem;
节点*下一步;
}*_头,*_尾;
节点*排序(节点*节点);
公众:
//其他声明。。。
}
模板
NODE*SList::sort(NODE*NODE)//错误:“NODE”未命名类型
{
//排序算法
}

这是C++的一个限制,还是我缺少了什么?

你想引用的类型在SLIST中,因此你必须这样引用:

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

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

此外,节点的定义根据
SList
的模板参数的不同而变化(它是一种依赖类型)

因此,您必须明确地引用
节点

template<class T>
typename SList<T>::NODE* SList<T>::sort(typename SList<T>::NODE* node) 
{
    //sorting algorithm
}
模板
typename SList::NODE*SList::sort(typename SList::NODE*NODE)
{
//排序算法
}
  • 请注意
    typename
    ,因为节点是一个依赖类型(它取决于
    SList
    的类型)
  • 请注意
    SList::Node
    ,因为Node是一种依赖于
    SList
    类型的类型
下面的操作很好:

template<class T>
typename SList<T>::NODE* SList<T>::sort(typename SList<T>::NODE* node)
^^^^^^^^^^^^^^^^^^^                     ^^^^^^^^^^^^^^^^^^^
模板
typename SList::NODE*SList::sort(typename SList::NODE*NODE)
^^^^^^^^^^^^^^^^^^^                     ^^^^^^^^^^^^^^^^^^^
这是c的限制吗++

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


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

您需要添加
typename
,因为
节点
是一个依赖类型啊,谢谢!我还得到了一个错误,我通过在模板声明后添加typename修复了这个错误。编辑:先告诉我现在可以通过“decltype”实现吗?@dahohu527我不确定我是否理解这个问题。能实现什么?也就是说,不,我不认为decltype在这种情况下有帮助-但是如果你能澄清一下,我可能能够更好地回答你的问题