Color(int, int, int)与Color(float, float, float)的歧义调用

3

如何在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

2
Color(1, 2, 3) 不会有歧义,但 Color(1., 2., 3.) 会有。请展示完整代码,否则没有人能帮助你。 - Johannes Schaub - litb
3
请先确定语言。 - H H
请包括详细信息,例如您使用的编程语言、库以及错误消息的完整文本。 - Josh Lee
请告诉我们您使用的编程语言(以及哪种编译器会有帮助),展示您正在尝试进行的确切调用,以及错误信息是什么。 - David Thornley
抱歉大家...太沉迷于C++了,忘记还有其他编程语言。 - Jake
4个回答

8
问题似乎是你声明了一个变量,但没有给它赋值。
Color(unsigned, unsigned, unsigned);
Color(float, float, float);

即,所有三个参数都必须是floatunsigned。如果您尝试使用其他类型(例如intdouble)调用它,则会产生歧义--编译器不知道您想要哪个,因为两者都是一样好的(或者如果您愿意,也可以说是一样差的)。您可以通过声明更多的重载来改善此情况:

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

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


哇,没错。这就是当智能感知不起作用时我变得愚蠢的原因。对此很抱歉。 - Jake

1
浮点型字面量的类型是 double,而不是 float。一般来说,除非你有特定的理由需要使用 float,比如需要占用更少的内存,否则你应该使用 double。正如其他答案所提到的,你似乎已经声明了:
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);

0
根据编程语言的不同,你可以进行强制类型转换,如果你正在使用C#或C++。
例如,对于C#:
Color((int)r, (int)g, (int)b)

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

0
根据你的测试用例,特别是`Color(r,g,b)`,我敢打赌你没有`Color(int, int, int)`,而是有`Color(unsigned int, unsigned int, unsigned int)`。这就是为什么会出现你意想不到的歧义调用的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接