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
4

4 回答 4

8

问题似乎是你已经宣布

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

即,所有三个参数必须是floator unsigned。如果您尝试使用其他类型(例如intor double)来调用它,它会模棱两可 - 编译器不知道您想要哪个,因为两者都只是一个好的(或者如果您愿意,也可以是坏的)。您可以通过声明更多重载来稍微改进一下:

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

但是如果尝试使用混合类型调用它,您仍然会遇到歧义错误。

于 2010-10-11T20:12:39.977 回答
1

浮点文字的类型是double, not 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);
于 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 回答