3

C++ でこれら 2 つのあいまいな呼び出しを解決するにはどうすればよいですか?

Color(int, int, int)
Color(float, float, float)

値がハードコードされている場合、つまりColor(1, 2, 3)変数である場合の両方があいまいですColor(r, g, b)。コンパイラがデータ型に従って解決しないのはなぜですか? 可変式で?

編集: 申し訳ありませんが、C++ が多すぎると、他の言語があることを忘れてしまいます。そして、それに関する「完全なコード」はあまりありません。

float x, y, z;
int r, g, b;
Color(1, 2, 3); // ambiguous
Color(1.0, 2.0, 3.0); // ambiguous
Color(r, g, b); // ambiguous  <--- this one is a real pain
Color((int)r, (int)g, (int)b); // ambiguous
Color(x, y, z); //OK
Color(1u, 2u, 3u); //OK
Color(1.0f, 2.0f, 3.0f); //OK
4

4 に答える 4

8

問題は、あなたが宣言したことのようです

Color(unsigned, unsigned, unsigned);
Color(float, float, float);

つまり、3 つの引数すべてが または のいずれfloatかでなければなりませんunsignedint他の型 ( or など) でそれを呼び出そうとするとdouble、あいまいです。どちらも良い (または必要に応じて悪い) ため、コンパイラはどちらが必要かを認識しません。より多くのオーバーロードを宣言することで、少し改善できます。

Color(int, int, int);
Color(double, double, double);

ただし、混合型で呼び出そうとすると、あいまいなエラーが発生します。

于 2010-10-11T20:12:39.977 に答える
1

浮動小数点リテラルのタイプはdouble、ではなく、floatです。一般に、メモリの消費量を減らす必要があるなど、double使用する特別な理由がない限り、を使用する必要があります。float他の回答が述べているように、あなたは次のように宣言したようです。

Color(unsigned int, unsigned int, unsigned int);
Color(float, float, float);

これは、たとえば、呼び出しにColor(int, int, int)は2つの可能な変換があり、どちらも優先されないことを意味します。これは、次のように宣言することで修正できます。

Color(int, int, int);
Color(double, double, double);

代わりに、クラス自体の中で必要な変換を実行するか、コンストラクターを次のように呼び出します。

Color((unsigned int)r, (unsigned int)g, (unsigned int)b);
于 2010-10-11T20:17:18.923 に答える
0

言語にもよりますが、C# または C++ を使用している場合は、おそらくキャストできます。

たとえば、C# の場合:
Color((int)r, (int)g, (int)b)
または
Color((float)r, (float)g, (float)b)

于 2010-10-11T19:53:24.893 に答える
0

あなたのテスト ケース、特にColor(r,g,b)を考えると、あなたには がないと思いますがColor(int, int, int)Color(unsigned int, unsigned int, unsigned int). そのため、予期しないあいまいな呼び出しを受けています。

于 2010-10-11T20:12:59.900 に答える