编译器如何选择正确的重载函数?

时间:2015-03-17 09:34:48

标签: c++ overloading

我有一个包含以下构造函数的类:

Color(const float red = 0.0f, const float green = 0.0f, const float blue = 0.0f, const float alpha = 1.0f);
Color(const unsigned char red, const unsigned char green, const unsigned char blue, const unsigned char alpha);
Color(const unsigned long int color);

如果我这样称呼它:

Color c{ 0.0f, 1.0f, 0.0f, 1.0f };
一切都好。但如果我称之为:

Color c{ 78, 180, 84, 255 };

Color c{ 0xffffffff };

我收到了

  

错误C2668:'Color :: Color':对重载函数的模糊调用

为什么呢?如何正确选择?

1 个答案:

答案 0 :(得分:3)

Color c{ 0.0f, 1.0f, 0.0f, 1.0f };是明确的,编译器可以选择采用浮点参数的构造函数。

使用Color c{ 78, 180, 84, 255 };,文字实际上是签名的类型。所以编译器必须转换文字。它有两个选择,并且不知道选择哪一个。

如果你写的是Color c{static_cast<unsigned char>(78), static_cast<unsigned char>(180), static_cast<unsigned char>(84), static_cast<unsigned char>(255) };,那么const unsigned char将会自动调用Color c{ 0xffffffff };个参数的构造函数。

同样,对于{{1}},该数字又是签名的十六进制文字。所以编译器不知道要使用哪一个。