4

I have a class with the following constructors:

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);

If I call it like this:

Color c{ 0.0f, 1.0f, 0.0f, 1.0f };

everything is ok. But if I call it:

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

or

Color c{ 0xffffffff };

I receive

error C2668: 'Color::Color' : ambiguous call to overloaded function

Why? How to make it choose correctly?

nikitablack
  • 4,359
  • 2
  • 35
  • 68
  • Similar to [c-overloading-resolution-method](http://stackoverflow.com/questions/29090692/c-overloading-resolution-method) – Jarod42 Mar 17 '15 at 09:39

1 Answers1

3

Color c{ 0.0f, 1.0f, 0.0f, 1.0f }; is unambiguous, the compiler can pick the constructor that takes floating point arguments.

With Color c{ 78, 180, 84, 255 };, the literals are actually signed types. So the compiler has to convert the literals. It has two choices and doesn't know which one to pick.

If you'd written, albeit tediously, Color c{static_cast<unsigned char>(78), static_cast<unsigned char>(180), static_cast<unsigned char>(84), static_cast<unsigned char>(255) }; then the constructor taking const unsigned char arguments would have been called automatically.

Again, with Color c{ 0xffffffff };, the number is again a signed hexadecimal literal. So the compiler doesn't know which one to use.

Bathsheba
  • 231,907
  • 34
  • 361
  • 483