使用左参数和右参数覆盖运算符
Override operators with a left and right parameter
我有一个简单的设置:
#include<iostream>
class Stuff {};
ostream &operator<<(ostream &lhs, const Stuff &rhs) {
return lhs << "something";
}
int main() {
Stuff stuff;
cout << stuff << endl;
cin.get();
}
其中operator<<
函数将模型Stuff
类打印到ostream
。我想做的是将该函数移动到Stuff
类本身中。如:
class Stuff {
ostream &operator<<(ostream &lhs, const Stuff &rhs) {
return lhs << "something";
}
};
不过,对于我的生活,我不知道如何让它工作。我感觉我正在尝试从右侧重新定义左关联运算符。有什么方法可以正确地做到这一点吗?
按照你定义它的方式,该函数将是 Stuff
的成员,所以如果C++允许它,你必须像这样称呼它:
Stuff stuff;
stuff.operator<<(std::cout, stuff);
所以你不想要那个。
二元运算符(如<<
)接受两个参数(称为操作数)。如果它是一个(非静态)成员函数,那么它必须是接受一个参数的成员函数,其中左操作数是调用函数的对象,右操作数是函数参数。 所以你可以这样做:
struct Stuff {
std::ostream& operator<<(std::ostream& o) { return o << something; }
};
Stuff s;
s << std::cout << std::endl;
但你可能也不想这样!
若要写入std::cout << s
运算符必须是左操作数的成员,或者必须是非成员函数,因此不能使其成为 Stuff
的成员。
也许您要做的是:
class Stuff {
friend std::ostream& operator<<(std::ostream& lhs, const Stuff& rhs) {
return lhs << "something";
}
};
friend
函数不是成员函数,因此这是有效的。
相关文章:
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- int() 导致参数覆盖
- 为什么覆盖虚函数时需要显式模板参数?
- 如何在派生类中正确覆盖具有不同参数的函数?
- 在子类函数覆盖中省略具有默认值的参数
- 有没有办法仅在两个模板参数相同时才覆盖匹配的模板方法?
- RVO 在返回之前覆盖参数中的值
- 覆盖Qt的鼠标按下事件中断移动事件参数
- C++ 重载和覆盖 - 无法使用类型的右值初始化类型的参数
- 覆盖虚拟函数 - 派生类具有不同的参数
- Vim :用带参数的命令覆盖 equalprg
- 覆盖运算符多个参数
- 为什么子类覆盖虚拟函数不能更改父类的默认函数参数
- 使用参数覆盖删除
- 可变参数模板和覆盖
- 覆盖使用模板参数包扩展声明的虚拟方法时遇到问题
- 使用左参数和右参数覆盖运算符
- 相同的函数名称与不同数量的参数覆盖我的基本函数
- 使用更多参数覆盖虚拟函数
- 如何使用lambda作为第一个参数覆盖可变参数模板