1

Code::Blocks の下で GNU GCC Compiler を使用しています。

    int foo(long s){cout<<"long"<<endl;return 0;}
    int foo(float s){cout<<"float"<<endl;return 0;}

    int main()
    {
        double a(3.2);
        foo(a);
        return 0;
    }

これによりあいまいなエラーが発生することはわかっていますが、ビルドメッセージが教えてくれます

error: call of overloaded 'foo(double&)' is ambiguous

上記のように、参照ではなく double 変数の値で引数を渡しました。

そして、 const double を使用するたびに:

foo(3.2);  // enclosed in main function

ビルド メッセージには、次のようなエラーが表示されます。

error: call of overloaded 'foo(double)' is ambiguous.

なぜこれが起こっているのだろうか。

double 変数と const double では、受け渡しのプロセスが同じではありませんか?

前もって感謝します。

4

4 に答える 4

3

パラメータに完全に適合するfoo(long)わけでもありません。両方とも暗黙的に変換できるfoo(float)ため、呼び出しは野心的です。doublelongfloat

追加のオーバーロードを提供するかdouble、適切なパラメーター型を使用することができます。

あなたの例は単純化されすぎていることに注意してください。次のコードは、エラー メッセージをトリガーします。

double bar = 3.2;
foo(bar);

これは、barが左辺値であり、完全一致がdouble&. それでも、foo(double)オーバーロードを指定すると、この関数を受け入れるだけになります。

于 2013-03-14T13:06:54.550 に答える
1

この小さなコードからは、なぜ彼がその特定のエラーを出しているのかわかりません。再作成しようとしましたが、& なしでしか取得できませんでした。コード全体または同じエラーが発生したより大きな例を表示できますか?

于 2013-03-14T13:13:09.387 に答える
1

foo(3.2)longは double を渡しているため、コンパイラは、またはfloatのバージョンfooが呼び出されることを意味するかどうかを知りません。

エラーを読みすぎるとは思いません。コンパイラは、指定された呼び出しサイトを検出した可能性のある型を伝えていますが、一致する呼び出し関数があった場合、参照は減衰しfoo(double)ます。

のオーバーロードを提供するだけでなく、を使用しdoubleてリテラルを a にすることができますfloat3.2f

于 2013-03-14T13:06:33.467 に答える
0

電話すると

foo(3.2);

コンパイラは、どちらを参照しているのかわかりません。「3.2」は、float または long のいずれかにキャストできます。

電話をかける場合:

foo((float)3.2);

できます。または、必要に応じてロングにキャストします。

あなたの質問は、エラーが double& に関するものであるように思われます - それは、 double 変数が foo(double&) のオーバーロードと最も密接に一致するためです。

double 型の変数とdouble 型を混同していると思います。次の 2 つの例の違いを見てください。

foo(3.2)

ここで、コンパイラはdouble 型を取るオーバーロードされたメソッドがないことを示しています

double a(3.2);
foo(a);

この例では、実際に変数を渡していますが、double 型の変数 (つまり double&) を渡すことができるオーバーロードされた関数がないため、double 変数を取るオーバーロードされたメソッドがないことがわかります。 、または double&.

それが理にかなっていることを願っています...

于 2013-03-14T13:05:56.980 に答える