[英]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.