2015-05-23 39 views
1

我並不擅長使用模板,但我不確定爲什麼我要在類SNode的定義中獲得error: 'SLinked_List' is not a class template: friend class SLinked_List<T>;。這段代碼有什麼問題?如何清除錯誤:X不是類模板

謝謝 Pranav

#include <iostream> 
#include <string> 

template <typename T> 
class SNode{ 
    friend class SLinked_List<T>; 
private: 
    T data; 
    SNode<T>* next; 
}; 

template <typename T> 
class SLinked_List{ 

private: 
    SNode<T>* head; 

public: 
    SLinked_List(){ 
     head = nullptr; 
    } 

    bool empty() const { return head == nullptr; } 

    void insert_first (const T&); 

}; 

template <typename T> 
void SLinked_List<T> :: insert_first (const T& t){ 
    SNode<T>* node = new SNode<T>; 
    node->data = t; 
    node->next = head; 
    head = node; 
} 

int main(){ 

    SLinked_List<std::string> ls; 

    ls.insert_first("Hello"); 

    return 0; 
} 

回答

5

當你使用模板參數是指你說,這種類型的已經存在的作爲模板的名稱,我想引用該模板的具體分工。在SNode裏面,SLinked_List還沒有被聲明,所以這是不允許的,因爲編譯器甚至不知道它是否是模板。

很顯然,要交好專業化採取T,所以你需要聲明SLinked_ListSNode

template <typename T> 
class SLinked_List; 

template <typename T> 
class SNode{ 
    friend class SLinked_List<T>; 
private: 
    T data; 
    SNode<T>* next; 
}; 

現在編譯器知道SLinked_List是一個模板,可以作爲這樣的被引用。

+0

哦,那我不知道!感謝@ 0x499602D2輸入。 :) – Pranav