将重载+成员函数的结果发送到重载<<导致编译错误
Sending result of overloaded + member function to overloaded << leads to compile error
我正在努力创建一个类来处理用于欧拉项目挑战的大量数据。 我已经重载了 <<和 + 来与班级一起工作。 以下内容编译并正常工作:
BigNum a(400000000);
BigNum b(400000000);
BigNum c;
c = a + b;
cout << c;
下面会产生编译错误:
BigNum a(400000000);
BigNum b(400000000);
cout << (a + b);
错误是:错误:与"std::cout <<BigNum::operator+(const BigNum&) const((const BigNum&)((const BigNum*)(& b))"中的"operator<<"不匹配
作为参考,下面是类定义和实现:
/* BigNum.h */
#include <iostream>
#include <vector>
class BigNum {
public:
BigNum();
BigNum(const BigNum &src);
BigNum(int num);
void print(std::ostream *os);
public:
BigNum &operator=(const BigNum &src);
BigNum &operator+=(const BigNum &src);
const BigNum operator+(const BigNum &src) const;
private:
bool negative;
std::vector<int> digits;
};
std::ostream &operator<<(std::ostream &os, BigNum &bNum);
/* BigNum.cpp */
#include "BigNum.h"
BigNum::BigNum() {
digits.push_back(0);
}
BigNum::BigNum(const BigNum &src) {
digits = src.digits;
}
BigNum::BigNum(int num) {
if(num == 0) {
digits.push_back(0);
}
else {
while(num != 0) {
digits.push_back(num % 10);
num /= 10;
}
}
}
void BigNum::print(std::ostream *os) {
int i;
for(i = digits.size() - 1; i >= 0; i--) {
*os << digits[i];
}
}
std::ostream &operator<<(std::ostream &os, BigNum &bNum) {
bNum.print(&os);
return os;
}
BigNum & BigNum::operator=(const BigNum &src) {
if(this == &src) return *this;
digits = src.digits;
return *this;
}
BigNum & BigNum::operator+=(const BigNum &src) {
int carry, i, k;
carry = 0;
if(digits.size() < src.digits.size()) {
digits.resize(src.digits.size(), 0);
}
{
k = src.digits.size();
for(i = 0; i < k; i++) {
digits[i] += src.digits[i];
digits[i] += carry;
carry = 0;
if(digits[i] > 9) {
carry = 1;
digits[i] -= 10;
}
}
k = digits.size();
for(i = src.digits.size(); i < k; i++) {
digits[i] += carry;
carry = 0;
if(digits[i] > 9) {
carry = 1;
digits[i] -= 10;
}
}
if(carry) {
digits.resize(digits.size() + 1, 1);
}
}
return *this;
}
const BigNum BigNum::operator+(const BigNum &src) const {
BigNum result(*this);
result += src;
return result;
}
为什么
cout << (a + b);
不工作? 有明显的解决方法,但我想了解为什么会发生这种情况。 我是C++新手,所以如果我还有其他做错的地方或可以做得更好,请告诉我。 谢谢。
operator<<
的重载不会占用operator+
返回的const BigNum
。将 operator<<
中的参数类型更改为 const BigNum &
。
该函数认为它允许修改传入的对象,但您传递的是一个不可修改的对象,因此它不匹配。
如下所述,您从那里调用的print()
函数也需要const
。
相关文章:
- C++重载<<具有typedef'd std::vector
- 重载运算符<<:此运算符函数的参数太多
- 在VS 2012上编译,但不使用Netbeans/MinGW-重载<<
- 重载运算符<<用于模板类.即使使用好友关键字也无法获得私人会员
- C++分离成员流重载<<
- 我已经完成了<<运算符重载,但它'It’不起作用
- 重载运算符<<输出地址而不是数据成员
- 重载运算符<<用于ostream语法
- 重载operator< & lt;作为会员打印
- Operator< & lt;重载隐藏其他
- 重载& lt; & lt;为什么我得到以下错误
- 重载ostream&时转换错误无效;operator< & lt;
- operator< & lt;在c++中为类中的类重载
- 重载& lt; & lt;用于打印自定义异常的操作符
- 重载<<运算符错误C2804:二进制'运算符<<'参数太多
- 上Ostream & lt; & lt;重载的困惑
- 重载& lt; & lt;为了我的班级
- 使用带有重载<<endl上的运算符
- 重载& lt; & lt;使用命名空间std
- operator< & lt;重载、名称空间和模板