簡體   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