在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;
}
我试图重载
我在这里做错了什么?
最佳答案
您将operator<<
声明为成员函数。因此,仅当调用对象在其左侧时才有效,例如
MyType m;
m << (std::cout);
看起来像个怪物。
最好是将它声明为朋友,
friend std::ostream& operator<<(std::ostream &os, const MyType& rhs)
{
os << ...; // do something with rhs here
return os;
}
那么您可以“自然地”调用它
std::cout << myobject;
译为
operator<<(std::cout, myobject);
StackOverflow有一个非常好的Operator overloading指南,您可以在其中找到有关运算符重载最佳实践的更多详细信息。
无关:
MyType myobject = MyType();
是多余且效率低下的,因为您是从必须构造的临时MyType()
复制左侧构造的(尽管编译器通常通过复制省略对其进行优化)。只需编写MyType myobject
就足够了,而且效率更高。关于c++ - 这些类型有什么问题?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28121618/