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/

10-11 19:18