重载输出流运算符:没有运算符“<<”与这些操作数匹配

Overloading output stream operator: no operator "<<" matches these operands

提问人:Hofbr 提问时间:11/4/2022 更新时间:11/4/2022 访问量:78

问:

我最近问了一个问题:ostream& operator<<在课堂上比使用 std::cout 更好吗?并得到了一个很好的答案。

当我尝试实施该解决方案时,我遇到了错误:

no operator "<<" matches these operands

binary '<<': no operator found which takes a right-hand operand of type 'LinkedList' (or there is no acceptable conversion)

在这种情况下,最简单的解决方案是将参数添加到您的方法中,例如:std::ostreamdisplay()

链接列表.h

#include <iostream>

#pragma once

class LinkedList
{
   struct Node {
      int data = 0;
      Node* prev = nullptr;
      Node* next = nullptr;
   };

private:
   Node* m_head;

public:
   // CONSTRUCTOR
   LinkedList();

   // DESTRUCTOR
   ~LinkedList();

   void display(std::ostream& out) const;
};

链接列表:.cpp

#include <iostream>
#include "LinkedList.h"

LinkedList::LinkedList() {
   m_head = nullptr;
}

void LinkedList::display(std::ostream &out) const {
   Node* curr = m_head;

   while (curr) {
      out << curr->data << " -> ";
      curr = curr->next;
   }
   out << std::endl;
}

std::ostream& operator<<(std::ostream &out, const LinkedList &list) {
    list.display(out);
    return out;
}

Main,.cpp(生成错误)

#include <iostream>
#include "LinkedList.h"

int main() {

   LinkedList list;
   std::cout << list;
}

C++ 运算符重载 IOSTREAM

评论


答:

0赞 Hofbr 11/4/2022 #1

我在这个问题上得到了一些帮助,但它很快就被删除了......

从本质上讲,问题在于没有正确宣传。std::ostream& operator<<(std::ostream &out, const LinkedList &list)

我们需要添加到类中的文件中friend std::ostream& operator<<(std::ostream& output, const SortedList& list);LinkedList.hLinkedList

链接列表.h

#include <iostream>

#pragma once

class LinkedList
{
   struct Node {
      int data = 0;
      Node* next = nullptr;
   };

private:
   Node* m_head;

public:
   // CONSTRUCTOR
   LinkedList();

   // DESTRUCTOR
   ~LinkedList();

   void display(std::ostream& out) const;
   
   friend std::ostream& operator<<(std::ostream& output, const LinkedList& list);

};

评论

2赞 Yksisarvinen 11/4/2022
注意:运算符重载通常需要声明为 ,因为它需要访问类的成员,但在你的情况下,它只调用一个函数,所以它也可以在没有关键字的情况下声明为类外。friendprivatepublicfriend
0赞 Hofbr 11/4/2022
这是一个很好的观点。作为作业要求的一部分,我不得不将其声明为朋友。但我认为你是对的,没有必要将其暴露为朋友。如果您将其作为解决方案发布,我将支持它。