Цвет (int, int, int) против цвета (поплавок, поплавок, поплавок) неоднозначный вызов

StackOverflow https://stackoverflow.com/questions/3909406

  •  29-09-2019
  •  | 
  •  

Вопрос

Как я могу разрешить неоднозначный вызов между этими двумя в 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
Это было полезно?

Решение

Похоже, проблема заключается в том, что вы объявили

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

т.е. все три аргии должны быть либо float или unsigned. Отказ Если вы попытаетесь позвонить в другие типы (например, int или double), это неоднозначно - компилятор не знает, какой вы хотите, так как оба являются просто хорошими (или плохими, если вы предпочитаете). Вы можете немного улучшить ситуацию, объявив больше перегрузки:

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

Но вы все равно получите ошибку двусмысленности, если попытаться позвонить в смешанные типы.

Другие советы

Тип буквального литературы с плавающей запятой double, нет 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);

Учитывая ваши тестовые случаи, особенно Color(r,g,b), Я держу пари, у тебя нет Color(int, int, int), но Color(unsigned int, unsigned int, unsigned int). Отказ Вот почему вы получаете неоднозначные звонки, которых вы не ожидаете.

В зависимости от языка, но вы, вероятно, можете лишить их, если вы используете C # или C ++.

Например, для C #:
Color((int)r, (int)g, (int)b)
или
Color((float)r, (float)g, (float)b)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top