Color (int, int, int) и Color (float, float, float) неоднозначный вызов - PullRequest
3 голосов
/ 11 октября 2010

Как я могу разрешить неоднозначный вызов между этими двумя в C ++?

Color(int, int, int)
Color(float, float, float)

Это неоднозначно, когда значения жестко закодированы, т.е. Color(1, 2, 3) и когда они являются переменными Color(r, g, b). Почему компилятор не разрешает в соответствии с типом данных? В переменной форме?

EDIT: Извините, слишком много 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

Ответы [ 4 ]

8 голосов
/ 12 октября 2010

Кажется, проблема в том, что вы объявили

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

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

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

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

1 голос
/ 12 октября 2010

Тип литерала с плавающей точкой: 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);
0 голосов
/ 12 октября 2010

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

0 голосов
/ 11 октября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...