编译器如何选择正确的重载函数?
How the compiler chooses correct overloaded function?
我有一个 class 具有以下构造函数:
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 };
我收到
error C2668: 'Color::Color' : ambiguous call to overloaded function
为什么?如何让它正确选择?
Color c{ 0.0f, 1.0f, 0.0f, 1.0f };
是明确的,编译器可以选择采用浮点参数的构造函数。
对于 Color c{ 78, 180, 84, 255 };
,文字实际上是 signed 类型。所以编译器必须转换文字。它有两个选择,不知道该选哪个。
如果您编写了 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 };
,该数字再次是 有符号 十六进制文字。所以编译器不知道该用哪一个。
我有一个 class 具有以下构造函数:
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 };
我收到
error C2668: 'Color::Color' : ambiguous call to overloaded function
为什么?如何让它正确选择?
Color c{ 0.0f, 1.0f, 0.0f, 1.0f };
是明确的,编译器可以选择采用浮点参数的构造函数。
对于 Color c{ 78, 180, 84, 255 };
,文字实际上是 signed 类型。所以编译器必须转换文字。它有两个选择,不知道该选哪个。
如果您编写了 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 };
,该数字再次是 有符号 十六进制文字。所以编译器不知道该用哪一个。