c++ - ++ 前缀运算符重载不适用于 <<
问题描述
这里有点新的 C++ 开发人员。我有一个类Rational
用于表示有理数并允许用户对它们执行算术和关系运算。我重载了所有运算符,它们都正常工作,除非我尝试将++/--
前缀运算符(例如,--Rational
)或+/-
一元运算符与<<
输出运算符组合在一起,如:
Rational num(7, 2); // initializes rational to 7/2 (fraction)
cout << --num; // should change val to 5/2 (decrements by one)
// error: no match for 'operator<<'(operand types are 'std::ostream' {aka 'std::basic_ostream<char>'} and 'Rational')
或者:
Rational num(1, 10);
cout << -num; // should change to -1/10
// error: no match for 'operator<<'(operand types are 'std::ostream' {aka 'std::basic_ostream<char>'} and 'Rational')
我不明白为什么,因为我已经重载了所有这些运算符以返回一个Rational
对象,并且我也重载了<<
运算符以接受一个Rational
对象。有趣的是,当我尝试这个时:
Rational num(5, 3);
cout << num;
它按预期工作。那么有人可以告诉我这里发生了什么吗?
类的相关代码:
class Rational
{
private:
// Instance variables declarations
int numerator, denominator;
public:
// Constructors declarations
Rational(int numer_val, int denom_val = 1);
Rational();
// Unary operators declarations
friend Rational operator +(const Rational &num);
friend Rational operator -(const Rational &num);
friend Rational operator ++(Rational &num);
friend Rational operator --(Rational &num);
// I/O operators
friend ostream& operator <<(ostream &outs, Rational &num);
};
// Constructors definitions
Rational::Rational(int numer_val, int denom_val) : numerator(numer_val)
{
set_denominator(denom_val); // irrelevant
simplify(); // irrelevant
}
Rational::Rational() : Rational(0) { }
// Unary operators definitions
Rational operator +(const Rational &num)
{
return Rational(+num.numerator, num.denominator);
}
Rational operator -(const Rational &num)
{
return Rational(-num.numerator, num.denominator);
}
Rational operator ++(Rational &num)
{
num.numerator += num.denominator;
return num;
}
Rational operator --(Rational &num)
{
num.numerator -= num.denominator;
return num;
}
// I/O operators
ostream& operator <<(ostream &outs, Rational &num)
{
outs << to_string(num.numerator) + "/" + to_string(num.denominator);
return outs;
}
解决方案
您的第二个参数operator<<
绑定到左值引用:
ostream& operator <<(ostream &outs, Rational & num)
// ^
但是您所有的运算符都返回 r 值。例如,当你这样做时:
cout << -num;
您正在尝试将左值引用绑定到右值,这是不允许的。
您可以通过更改operator<<
为接受 const 引用来解决此问题:
ostream& operator <<(ostream &outs, Rational const & num)
// ^^^^^^^
推荐阅读
- flow-project - 尝试将 Aimsun 与 Flow 结合使用时出现错误“没有名为 flow 的模块”
- jquery - 如何将处理程序添加到 JQuery 中动态创建的 tr?
- c# - 使用 Azure Functions 自动将 Excel 保存为 CSV
- python - 为什么我的代码返回空白?(用 Scrapy 刮)
- sql - 不可能完成的任务?针对多个服务器上的分片数据库的智能视图
- javascript - Changing text of HTML
- ios - 应用程序包含在线视频和离线服务。Apple 如何定义 30% 的费用?
- sumo - 运行相扑流演示示例时遇到问题
- java - 在 Java 中写入/读取 txt 文件时的奇怪行为
- django - Django 在域上托管