Цвет (int, int, int) против цвета (поплавок, поплавок, поплавок) неоднозначный вызов
Вопрос
Как я могу разрешить неоднозначный вызов между этими двумя в 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)