【问题标题】:Declaring a struct in a template class, undefined for member functions在模板类中声明结构,成员函数未定义
【发布时间】:2012-11-13 15:06:03
【问题描述】:

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

【问题讨论】:

    标签: c++ templates struct


    【解决方案1】:

    由于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&lt;T&gt;::Node,因为 Node 是 依赖 SList 的类型的类型。

    【讨论】:

    • 现在可以通过“decltype”实现吗?
    • @dahohu527 我不确定我是否理解这个问题。能达到什么目的?也就是说,不,我认为 decltype 在这种情况下没有帮助 - 但如果你能澄清一下,我可能能够更好地回答你的问题
    【解决方案2】:

    以下工作正常:

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

    这是c++的限制吗

    。因为在SList&lt;&gt; 的范围之外可以有任何名为NODE 的结构/类型;所以实际上它是 C++ 为您提供的一个工具,您可以在不同的范围内拥有相同的名称类型。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 你需要添加typename,因为Node是一个依赖类型
      • 啊,谢谢!我还遇到了一个错误,我通过在模板声明后添加 typename 来修复它。编辑:打败我
      猜你喜欢
      • 1970-01-01
      • 2021-12-28
      • 2018-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-07
      • 1970-01-01
      相关资源
      最近更新 更多