Color(int,int,int)vs Color(float,float,float)模糊调用

时间:2010-10-11 19:42:50

标签: c++ call ambiguous

如何在C ++中解决这两者之间的模糊调用?

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 个答案:

答案 0 :(得分:8)

问题似乎是你宣布了

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

即,所有三个args必须是floatunsigned。如果你尝试用其他类型(例如intdouble)调用它,它的含糊不清 - 编译器不知道你想要哪个,因为两者都只是一个好的(如果你是坏的话)喜欢)。您可以通过声明更多重载来改进一些事情:

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

但是如果尝试用混合类型调用它,你仍然会出现歧义错误。

答案 1 :(得分:1)

浮点文字的类型为double,而不是float。通常,您应该使用double,除非您有使用float的特定原因,例如需要消耗更少的内存。正如其他答案所提到的,你似乎已经宣布:

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

这意味着调用,例如Color(int, int, int)有两种可能的转换,这两种转换都不是首选。您可以通过声明:

来解决此问题
Color(int, int, int);
Color(double, double, double);

相反,在类本身内执行您需要的任何转换,或者将构造函数调用为:

Color((unsigned int)r, (unsigned int)g, (unsigned int)b);

答案 2 :(得分:0)

取决于语言,但如果您使用的是C#或C ++,则可以强制转换它们。

e.g。对于C#:
Color((int)r, (int)g, (int)b)

Color((float)r, (float)g, (float)b)

答案 3 :(得分:0)

鉴于您的测试用例,尤其是Color(r,g,b),我敢打赌您没有Color(int, int, int),而是Color(unsigned int, unsigned int, unsigned int)。这就是为什么你得到了一些你没想到的含糊不清的电话。