我按照我在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
我不知道它是如何受到影响所以我应该可以访问所有私人会员吗?
答案 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;
}