运算符<<必须采用恰好一个参数

#include "logic.h" ... class A { friend ostream& operator<<(ostream&, A&); ... }; 

logic.cpp

 #include "ah" ... ostream& logic::operator<<(ostream& os, A& a) { ... } ... 

当我编译时,它说:

std :: ostream&logic :: operator <<(std :: ostream&,A&)'必须只有一个参数。

问题是什么?

问题是你在类里面定义它,哪个

a)表示第二个参数是隐式的( this )和

b)它不会做你想做的事情,即扩展std::ostream

你必须把它定义为一个自由函数:

 class A { /* ... */ }; std::ostream& operator<<(std::ostream&, const A& a); 

一个朋友函数不是一个成员函数,所以问题是你声明operator<<作为A的朋友:

  friend ostream& operator<<(ostream&, A&); 

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

  ostream& logic::operator<<(ostream& os, A& a) ^^^^^^^ 

你对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; } 

我遇到了模板类的这个问题。 以下是我必须使用的更一般的解决scheme:

 template class <T> class myClass { int myField; // Helper function accessing my fields void toString(std::ostream&) const; // Friend means operator<< can use private variables // It needs to be declared as a template, but T is taken template <class U> friend std::ostream& operator<<(std::ostream&, const myClass<U> &); } // Operator is a non-member and global, so it's not myClass<U>::operator<<() // Because of how C++ implements templates the function must be // fully declared in the header for the linker to resolve it :( template <class U> std::ostream& operator<<(std::ostream& os, const myClass<U> & obj) { obj.toString(os); return os; } 

现在:*我的toString()函数不能内联,如果它将被隐藏在CPP。 *你在头部卡住了一些代码,我无法摆脱它。 *运算符将调用toString()方法,它不是内联的。

运算符<<的主体可以在friend子句中或者在类之外声明。 这两个选项都很难看。 🙁

也许我误解或遗漏了一些东西,但只是向前 – 声明运营商模板不链接到gcc。

这也起作用:

 template class <T> class myClass { int myField; // Helper function accessing my fields void toString(std::ostream&) const; // For some reason this requires using T, and not U as above friend std::ostream& operator<<(std::ostream&, const myClass<T> &) { obj.toString(os); return os; } } 

我想你也可以避免在头文件中强制声明的模板问题,如果你使用一个非模板化的父类来实现operator <<,并使用一个虚拟的toString()方法。