2014-12-20 88 views
0

我跟着我的計算器發現來實現鏈表模板類的指令,我做到了,如下所示:ostream的<<操作符與模板類,不能訪問私有成員

template<typename T> class List; 
template<typename T> std::ostream& operator<<(std::ostream&, const List<T>&); 

template<typename T> 
class List { 
private: 
    struct Item { 
     T value; 
     Item *next; 
     Item *prev; 

     Item(const T &value, Item *next, Item *prev) 
       : value(value), next(next), prev(prev) { 
     } 
    }; 

    Item *head; 
    Item *tail; 
    int size; 
public: 
    List();  
    ~List();  
    List(const List&) = delete;  
    List& operator=(const List &) = delete;  
    friend std::ostream& operator<< <>(std::ostream&, const List<T>&); 
}; 

template <typename T> 
std::ostream& operator<<(std::ostream& os, const List<T>& list) { 
    Item* p = list.head; 
    while (p != NULL) { 
     os << p->value << " "; 
     p = p->next; 
    } 
    return os; 
} 

但是我得到一個錯誤

error: 'Item' was not declared in this scope 

我不知道它是如何融洽的,所以我應該有權訪問所有私人會員?

+0

朋友宣言 '的std :: ostream的和運營商<<(STD :: ostream的和,常量列表&)' 聲明一個非模板函數 – user3758262

+0

呀,你別管了-S –

+0

列表類型爲類型名'列表 :: Item',或者你可以說:for(auto p = list.head; p; p = p-> next){os << p-> value <<「」; }' –

回答

4

Item正的List每類模板專業化的成員不能在全局函數(模板)operator<<發現裏面。您需要typename List<T>::Item才能在類List<T>內查找名稱Item

template <typename T> 
std::ostream& operator<<(std::ostream& os, const List<T>& list) { 
    typename List<T>::Item* p = list.head; // <- here 
    while (p != NULL) { 
     os << p->value << " "; 
     p = p->next; 
    } 
    return os; 
} 
+0

我不知道這是你的意思,但我把它添加到實施\t像這樣List :: Item * p = list.head;這給出錯誤「'p'沒有在此範圍內聲明」 – user3758262

+0

嗯。我不完全明白你做了什麼。在我的答案和這個現場示例中查看最近添加的代碼塊:http://coliru.stacked-crooked.com/a/f4722d370aaefa97(我已經爲構造函數和析構函數添加了虛擬實現) – dyp

+0

以及謝謝,我不知道如何以及爲什麼,我從來沒有在這種情況下看到typename關鍵字 – user3758262

相關問題