12

この種のエラーについてここでいくつかの投稿を読みましたが、これを解決できませんでした...すぐに演算子 int と関数 f を定義すると、コンパイルに失敗します。問題を解決できなかったので、いくつかのことをテストしました....ありがとう

ex1.cpp: In function ‘int main(int, char**)’:
ex1.cpp:35:13: error: ambiguous overload for ‘operator+’ in ‘a + 4’
ex1.cpp:35:13: note: candidates are:
ex1.cpp:35:13: note: operator+(int, int) <built-in>
In file included from ex1.cpp:3:0:
Fraccao.h:41:9: note: Fraccao operator+(const Fraccao&, const Fraccao&)
ex1.cpp:38:13: error: ambiguous overload for ‘operator+’ in ‘4 + a’
ex1.cpp:38:13: note: candidates are:
ex1.cpp:38:13: note: operator+(int, int) <built-in>
In file included from ex1.cpp:3:0:
Fraccao.h:41:9: note: Fraccao operator+(const Fraccao&, const Fraccao&)

クラス:

class Fraccao {
    int numerador;
    int denominador;

public:
    Fraccao(int num = 0, int deno = 1) : numerador(num), denominador(deno) {}

    Fraccao & operator+=(const Fraccao &fra);

    Fraccao & operator*=(const Fraccao &fra);

    operator int() const;

    const Fraccao & operator++();
    const Fraccao operator++(int);

    string getAsString() const;
};

Fraccao operator +(const Fraccao &a, const Fraccao &b);
ostream & operator<<(ostream & saida, const Fraccao & fra);

そして私のメインで:

void func(int n) {
    cout << n; // 
}

int main(int argc, char** argv) {
    //...
    d = a + b;
    const Fraccao h(7, 3);
    func(h);

    return 0;
}
4

3 に答える 3

13

問題を解決するには、いくつかのオプションがあります。

  • から への暗黙的な変換を禁止intするFraccao: コンストラクターを作成しexplicitます。
  • から への暗黙的な変換を禁止Fraccaoするint: 変換演算子を作成しexplicitます。

  • Fraccao f; int i;またはを指定して、呼び出し側で手動で変換しint(f)+iますf+Fraccao(i)

  • あいまいさを解決するために追加のオーバーロードを提供します。

Fraccao operator +(const Fraccao &a, const Fraccao &b);
Fraccao operator +(const int a, const Fraccao &b);
Fraccao operator +(const Fraccao &a, const int b);

後者はおそらく、次のことも必要であることを意味します。

Fraccao & operator+=(const Fraccao &fra);
Fraccao & operator+=(const int i);

最後に、後者が必要な場合は、Boost.Operatorsや私のdf.operatorsなどのライブラリを使用してサポートし、同じフォワーダーを何度も書くことを避けることができます。

于 2013-11-06T18:02:27.220 に答える
7

コンパイラは 2 つの解釈方法を認識しますa + 44型のオブジェクトに変換してFraccao使用するoperator+(const Fraccao&, const Fraccao&)か、メンバー変換演算子を使用aして型に変換し、結果に追加できます。オーバーロードのルールはこれを曖昧にし、それがコンパイラーの不満です。一般に、@gx_ がコメントで述べたように、この問題は両方向の変換があるために発生します。(C++11) でマークすると、コードは問題ありません。int4operator int()explicit

于 2013-11-06T17:54:17.030 に答える