ostream << 具有模板类的操作员,无法访问私有成员

ostream << operator with template class, cannot access private members

本文关键字:lt 访问 成员 ostream 操作员      更新时间:2023-10-16

我按照我在stackoverflow上找到的说明来实现链表模板类,我这样做如下:

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

我不知道如何,因为它是朋友,所以我应该可以访问所有私人成员,对吗?

>ItemList的每个类模板专用化的成员,因此在全局函数(模板(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;
}