0

次のコードが機能しない理由を理解しているか、少なくとも考えがあります。

class Spambar {
    public:
        Spambar() {};
        Spambar(Spambar& sb) {};

        Spambar operator + (Spambar sb) {
            Spambar new_sb;
            return new_sb;
        }
};

int main() {
    Spambar sb1;
    Spambar sb2;
    Spambar sb3 = sb1 + sb2;  // <<< Error: "No matching function for call to ... "
}

問題は、コピーコンストラクターがインスタンスへの参照を期待していることだと思いSpambarます。参照は返されず、浅いインスタンスが返されるため、コンパイルは失敗します。

それで、どうすればそれを機能させることができますか?

4

2 に答える 2

3

問題は、 の結果がsb1 + sb2一時的であることです。初期化に使用されるコピー コンストラクターにsb3は非const参照が必要です。const非参照を一時的に取ることはできません。

ほとんどの場合、コンストラクターのパラメーターの型を に変更して、これを修正する必要がありますSpambar const &。あなたがそれに取り組んでいる間、あなたはほぼ確実に に対して同じことをしoperator+、また演算子自体を作るべきですconst:

Spambar(Spambar const &);
Spambar operator + (Spambar const &) const;

mutable非常に奇妙なことをしていて、実際にコピーコンストラクターにその引数を変更させたい場合は、一時的なものを渡さないようにするか、 orで厄介なハックを行う必要がありconst_castます。C++11 では、Spambar &&この種のことに対して、パラメーター type を指定してムーブ コンストラクターを使用します。

于 2012-04-13T16:22:21.677 に答える
2

constあなたのクラスには、参照を取るコピー コンストラクターがありません。通常、コピー コンストラクターは次のようになります。

Spambar(const Spambar&);

表示されているフォームは非常にまれな状況でのみ使用されており、おそらくコードの動作を妨げています.

于 2012-04-13T16:11:32.347 に答える