这些类型有什么问题?
What is wrong with these types?
在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;
}
我正在尝试为自定义类型重载 <<。当我这样做时,出现此错误:/main.cpp:14:15: Invalid operands to binary expression ('ostream' (aka 'basic_ostream<char>') and 'MyType')
我做错了什么?
您将 operator<<
声明为成员函数。所以它只有在调用对象在其左侧时才有效,如
MyType m;
m << (std::cout);
看起来像个怪物。
最好是加为好友,
friend std::ostream& operator<<(std::ostream &os, const MyType& rhs)
{
os << ...; // do something with rhs here
return os;
}
然后你可以"naturally"调用它
std::cout << myobject;
翻译为
operator<<(std::cout, myobject);
Whosebug 有一个关于 Operator overloading 的非常好的指南,您可以在其中找到有关运算符重载最佳实践的更多详细信息。
无关:
MyType myobject = MyType();
是冗余且低效的,因为您是从临时的 MyType()
复制构造左侧,而临时 MyType()
也必须构造(尽管编译器通常通过复制省略对其进行优化)。只写 MyType myobject
.
就足够了,而且效率更高
在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;
}
我正在尝试为自定义类型重载 <<。当我这样做时,出现此错误:/main.cpp:14:15: Invalid operands to binary expression ('ostream' (aka 'basic_ostream<char>') and 'MyType')
我做错了什么?
您将 operator<<
声明为成员函数。所以它只有在调用对象在其左侧时才有效,如
MyType m;
m << (std::cout);
看起来像个怪物。
最好是加为好友,
friend std::ostream& operator<<(std::ostream &os, const MyType& rhs)
{
os << ...; // do something with rhs here
return os;
}
然后你可以"naturally"调用它
std::cout << myobject;
翻译为
operator<<(std::cout, myobject);
Whosebug 有一个关于 Operator overloading 的非常好的指南,您可以在其中找到有关运算符重载最佳实践的更多详细信息。
无关:
MyType myobject = MyType();
是冗余且低效的,因为您是从临时的 MyType()
复制构造左侧,而临时 MyType()
也必须构造(尽管编译器通常通过复制省略对其进行优化)。只写 MyType myobject
.