运算符<<必须采用恰好一个参数
啊
#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
,两个参数是a
和b
。
你想定义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()方法。