operator <<必须只取一个参数

As *_* As 83 c++ iostream operator-overloading

#include "logic.h"
...

class A
{
friend ostream& operator<<(ostream&, A&);
...
};
Run Code Online (Sandbox Code Playgroud)

logic.cpp

#include "a.h"
...
ostream& logic::operator<<(ostream& os, A& a)
{
...
}
...
Run Code Online (Sandbox Code Playgroud)

当我编译时,它说:

std :: ostream&logic :: operator <<(std :: ostream&,A&)'必须只接受一个参数.

问题是什么?

Cat*_*lus 115

问题是你在类中定义了它

a)表示第二个参数是implicit(this)和

b)它不会做你想做的事,即延伸std::ostream.

您必须将其定义为自由函数:

class A { /* ... */ };
std::ostream& operator<<(std::ostream&, const A& a);
Run Code Online (Sandbox Code Playgroud)

  • 此外,他将其声明为友元函数,并将其定义为成员函数. (8认同)
  • 正如 https://en.cppreference.com/w/cpp/language/operators 中提到的,“将 std::istream&amp; 或 std::ostream&amp; 作为左手参数的运算符 &gt;&gt; 和运算符 &lt;&lt; 的重载是称为插入和提取运算符。由于它们采用用户定义类型作为正确参数(a@b 中的 b),因此它们必须作为非成员实现”。 (2认同)

Jon*_*ely 48

友元函数不是成员函数,因此问题是您声明operator<<为以下的朋友A:

 friend ostream& operator<<(ostream&, A&);
Run Code Online (Sandbox Code Playgroud)

然后尝试将其定义为类的成员函数 logic

 ostream& logic::operator<<(ostream& os, A& a)
          ^^^^^^^
Run Code Online (Sandbox Code Playgroud)

您是否logic是类或命名空间?

这个错误是因为你试图定义一个带有operator<<两个参数的成员,这意味着它需要三个参数,包括隐含this参数.运算符只能接受两个参数,因此当你写a << b两个参数时,ab.

你想定义ostream& operator<<(ostream&, const A&)为一个成员函数,绝对不是一个成员,logic因为它与该类无关!

std::ostream& operator<<(std::ostream& os, const A& a)
{
  return os << a.number;
}
Run Code Online (Sandbox Code Playgroud)