1

プロジェクト オイラーチャレンジで使用する非常に大きな数を処理するクラスの作成に取り組んでいます。クラスを操作するために << と + の両方をオーバーロードしました。以下はコンパイルされ、適切に動作します。

BigNum a(400000000);
BigNum b(400000000);
BigNum c;

c = a + b;

cout << c; 

以下は、コンパイル エラーを生成します。

BigNum a(400000000);
BigNum b(400000000);

cout << (a + b); 

エラー: エラー: no match for 'operator<<' in 'std::cout << BigNum::operator+(const BigNum&) const(((const BigNum&)((const BigNum*)(& b)))) '

参考までに、クラスの定義と実装を次に示します。

/* 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++ を初めて使用するので、他に間違っていることや改善できる点があれば教えてください。ありがとうございました。

4

1 に答える 1

2

のオーバーロードは、その戻り値operator<<を取りません。のパラメータ タイプを に変更します。const BigNumoperator+operator<<const BigNum &

関数は、渡されたオブジェクトを変更することが許可されていると考えていますが、変更不可能なオブジェクトを渡しているため、一致しません。

以下で指摘されているように、そこから呼び出す関数も同様print()である必要があります。const

于 2012-05-12T20:41:14.113 に答える