我正在尝试为cout和我的自定义链接列表类重载<<操作符。但是,在LinkedList.hpp(LinkedList<T>::Node* ptr = list.getHead();
)的最后一个方法中,在实际声明本身的行上出现错误“在此范围内未声明ptr”。我想念什么吗?
代码如下:
// LinkedList.hpp
#ifndef LINKED_LIST_HPP
#define LINKED_LIST_HPP
#include <stdexcept>
#include <iostream>
template <typename T>
class LinkedList {
public:
class Node {
private:
T _data;
Node* _next;
public:
Node(T data);
T getData();
Node* getNext();
};
LinkedList();
~LinkedList();
int size();
LinkedList<T>::Node* getHead();
private:
LinkedList<T>::Node* _head;
int _size;
};
template <typename T>
std::ostream& operator<<(std::ostream& strm, LinkedList<T>& list);
#include "LinkedList.cpp"
#endif
// LinkedList.cpp
template <typename T>
LinkedList<T>::Node::Node(T data) {
_data = data;
_next = nullptr;
}
template <typename T>
T LinkedList<T>::Node::getData() {
return _data;
}
template <typename T>
typename LinkedList<T>::Node* LinkedList<T>::Node::getNext() {
return _next;
}
template <typename T>
LinkedList<T>::LinkedList() {
_head = nullptr;
_tail = nullptr;
_size = 0;
}
template <typename T>
LinkedList<T>::~LinkedList() {
Node* ptr = _head;
while (ptr != nullptr) {
_head = _head->getNext();
delete ptr;
ptr = _head;
}
}
template <typename T>
int LinkedList<T>::size() {
return _size;
}
template <typename T>
typename LinkedList<T>::Node* LinkedList<T>::getHead() {
return _head;
}
template <typename T>
std::ostream& operator<<(std::ostream& o, LinkedList<T>& list) {
if (list.size() == 0) {
o << "NULL";
}
else {
LinkedList<T>::Node* ptr = list.getHead();
while (ptr->getNext() != nullptr) {
o << ptr->getData() << " -> ";
}
o << ptr->getData();
}
return o;
}
答案 0 :(得分:2)
这似乎是一个问题,Node
是一个依赖类型,因此您需要这样做:
typename LinkedList<T>::Node* ptr = list.getHead();
有关何时必要以及原因的更多详细信息,请参见以下答案:Where and why do I have to put the "template" and "typename" keywords?