我正在尝试重载输出运算符。
程序编译,但不是输出(节点列表)它会打印一些地址。
你能解释一下我犯错的地方吗?
我确信displayList函数是正确的。如果你还看到不正确的东西,请告诉我。
修改: 如果我取消引用myList,我会收到错误: 未明确引用`operator<<(std :: ostream&,SingleLinkedList const&)' const有什么问题吗?
完整的可执行代码 - https://codepad.remoteinterview.io/DPAXORFXKM
输出:
Constructor called...
Display function:
10 --> 20 --> 30 -->
Display - overloaded operator:
0x9152a10
Destructor called...
template <typename T>
class SingleLinkedList{
protected:
struct Node{
T data;
Node * next;
Node() : next(nullptr) {}
Node(const int num) : data(num), next(nullptr) {}
};
private:
Node * head;
Node * tail;
public:
SingleLinkedList();
~SingleLinkedList();
void insert(T const& value);
void displayList(std::ostream& stream = std::cout);
friend std::ostream& operator<<(std::ostream& os, const SingleLinkedList& list);
};
template <typename T>
void SingleLinkedList<T>::displayList(std::ostream& stream){
Node * temp = nullptr;
temp = head;
while(temp!=nullptr){
stream << temp->data << " --> ";
temp = temp->next;
}
stream << std::endl;
}
template <typename T>
std::ostream& operator<<(std::ostream& os, const SingleLinkedList<T>& list){
list.displayList(os);
return os;
}
int main(){
SingleLinkedList<int> * myList = new SingleLinkedList<int>();
myList->insert(10);
myList->insert(20);
myList->insert(30);
std::cout << "Display function:" << std::endl;
myList->displayList();
std::cout << "Display - overloaded operator:" << std::endl;
std::cout << myList << std::endl;
delete myList;
return 0;
}
答案 0 :(得分:4)
您正在将myList交给std :: cout。该变量是指向列表的指针。
要打印出列表本身,您必须取消引用指针:
std::cout << "Display - overloaded operator:" << std::endl;
std::cout << *myList << std::endl;
答案 1 :(得分:3)
许多错误:
首先,删除friend std::ostream& operator<<(std::ostream& os, const SingleLinkedList& list);
,没有必要
第二,将displayList
更改为const
(事实上,此功能不会修改列表,并且它不必 - 一般来说,始终标记避开&的函数#39; t修改实例const
- 可以为const
实例调用const
函数,就像在operator<<
中一样:
void displayList(std::ostream& stream = std::cout) const;
和
template <typename T>
void SingleLinkedList<T>::displayList(std::ostream& stream) const{
最后,通过解除引用显示列表而不是指向列表的指针:
std::cout << *myList << std::endl;