2009-09-30 2 views
1

Почему это ошибка: ie. arent длинный длинный и длинный двойной разные типы?Почему это «перегруженная двусмысленность» в gcc?

../src/qry.cpp", line 5360: 
Error: Overloading ambiguity between "Row::updatePair(int, long long)" 
and "Row::updatePair(int, long double)". 

Телефонный код: . . pRow -> updatePair (924, 0.0); pRow -> updatePair (925, 0.0); .

+2

Давайте посмотрим больше вашего кода, особенно код, который вызывает updatePair – Mark

+0

Кстати, это законно назвать это «компиляция ** r ** error»? Может быть, это должно звучать как «ошибка компиляции»? –

+0

does updatePair имеет значение по умолчанию для второго аргумента? – shoosh

ответ

1
    $1  $2 
Row::updatePair(int, long long) // #1 
Row::updatePair(int, long double) // #2 


// updatePair(924, 0.0); 
// int -> int (#1) // $1#1 
// int -> int (#2) // $1#2 
// 
// double -> long long // $2#1 
// double -> long double // $2#2 

В этом случае оба преобразования в первой группе являются точными совпадениями, тогда как оба преобразования во второй группе являются преобразованиями. Они одинаково оценены - это как int -> long vs int -> double. Другой вызов имеет одни и те же типы, только разные значения, поэтому он демонстрирует то же поведение.

Только float -> double является продвижением по службе, как и только целые типы, меньшие, чем int для int (и для некоторых экзотических платформ для unsigned int) - это рекламные акции. Таким образом, следующий не будет неоднозначным

    $1  $2 
Row::updatePair(int, double) // #1 
Row::updatePair(int, long double) // #2 


// updatePair(924, 0.0f); 
// int -> int (#1) // $1#1 
// int -> int (#2) // $1#2 
// 
// float -> double // $2#1 (promotion - not a ranked as conversion). 
// float -> long double // $2#2 

В этом случае, второй аргумент имеет лучшую последовательность преобразования при преобразовании в параметре #1.

3

Постоянная 0.0 имеет тип double, который не соответствует вашим перегруженным функциям. Вы можете ожидать, что ваш компилятор будет выбирать версию long double, но компилятор не хочет делать это предположение для вас.

Вы должны быть более ясно, какую версию вы хотите, чтобы компилятор назвать:

pRow -> updatePair(924, 0.0L); 

будет вызывать версию long double.

или:

pRow -> updatePair(924, 0LL); 

будет вызывать версию long long.

Смежные вопросы