【问题标题】:How the compiler chooses correct overloaded function?编译器如何选择正确的重载函数?
【发布时间】:2015-05-19 16:14:25
【问题描述】:

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

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' : 对重载函数的模糊调用

为什么?如何让它正确选择?

【问题讨论】:

标签: c++ overloading


【解决方案1】:

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 };,数字又是一个有符号 十六进制文字。所以编译器不知道使用哪一个。

【讨论】:

  • 不幸的是 Color c{ 78U, 180U, 84U, 255U }; 我有同样的错误。
  • 78U 不是 unsigned char 文字。
  • 没错!这是an unsigned int。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多