这些类型有什么问题?

时间:2015-01-24 02:16:16

标签: c++ operator-overloading

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')

我在这里做错了什么?

1 个答案:

答案 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就足够了,效率更高。