ostream<<运算符与模板类,无法访问私有成员

时间:2014-12-20 19:18:53

标签: c++ templates private friend

我按照我在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

我不知道它是如何受到影响所以我应该可以访问所有私人会员吗?

1 个答案:

答案 0 :(得分:4)

Item是{em>全局函数(模板)List中无法找到operator<<的每个类模板特化的成员。您需要typename List<T>::Item在类Item中查找名称List<T>

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;
}