在main.cpp
:
#include <iostream>
#include "MyType.h"
int main(int argc, const char * argv[]) {
MyType myobject = MyType();
std::cout << myobject; //error here
return 0;
}
MyType.h
中的:
#include <ostream>
class MyType {
public:
MyType();
std::ostream& operator<<(std::ostream &os);
};
MyType.cpp
中的:
#include "MyType.h"
#include <iostream>
MyType::MyType() {
}
std::ostream& MyType::operator<<(std::ostream &os){
return os;
}
我正在尝试重载&lt;&lt;对于自定义类型。当我这样做时,我收到此错误:/main.cpp:14:15: Invalid operands to binary expression ('ostream' (aka 'basic_ostream<char>') and 'MyType')
我在这里做错了什么?
答案 0 :(得分:7)
您将operator<<
声明为成员函数。因此,只有在调用对象位于其左侧时才会起作用,如
MyType m;
m << (std::cout);
看起来像怪物。
最好将其宣布为朋友,
friend std::ostream& operator<<(std::ostream &os, const MyType& rhs)
{
os << ...; // do something with rhs here
return os;
}
那么你可以自然而然地#34;调用它
std::cout << myobject;
,翻译为
operator<<(std::cout, myobject);
StackOverflow有一个关于Operator overloading的非常好的指南,您可以在其中找到有关运算符重载最佳实践的更多详细信息。
<强>相依强>:
MyType myobject = MyType();
是多余且低效的,因为你是从必须构造的临时MyType()
构建左侧的副本(尽管编译器通常通过复制省略来优化它)。只需编写MyType myobject
就足够了,效率更高。