Функция C ++, перегружающая похожие преобразования - PullRequest
3 голосов
/ 23 декабря 2009

Я получаю сообщение об ошибке, в котором говорится, что две перегрузки имеют одинаковые преобразования. Я перепробовал слишком много вещей, но ничего не помогло.

Вот этот кусок кода

CString GetInput(int numberOfInput, BOOL clearBuffer = FALSE, UINT timeout = INPUT_TIMEOUT);
CString GetInput(int numberOfInput, string szTerminationPattern, BOOL clearBuffer = FALSE, UINT timeout = INPUT_TIMEOUT);

Я не могу понять, как строка может быть равна long ?

Я использую Visual C ++ 6 (да, я знаю, что он старый, я работаю над устаревшим кодом, поэтому я в значительной степени беспомощен)

РЕДАКТИРОВАТЬ: Строка кода, которая вызывает ошибку является

l_szOption = GetInput(13, FALSE, 30 * 10);

Ответы [ 5 ]

4 голосов
/ 23 декабря 2009

Проблема вызвана тем, что вы предоставляете аргумент времени ожидания в виде целочисленного значения со знаком , которое необходимо преобразовать в беззнаковое для первой версии функции (начиная с параметра времени ожидания) объявляется как UINT).

т.е. первая версия функции требует преобразования для третьего аргумента, в то время как вторая версия функции требует преобразования для второго аргумента (FALSE, то есть просто 0, в string). В этом случае ни одна из функций не лучше, чем другая, и разрешение перегрузки не выполняется.

Попробуйте явно дать третьему аргументу тип без знака

l_szOption = GetInput(13, FALSE, 30U * 10);

или

l_szOption = GetInput(13, FALSE, (UINT) 30 * 10);

(в зависимости от того, что вы предпочитаете), и код должен компилироваться, как ожидается.

Другими словами, компилятор абсолютно прав, чтобы жаловаться на ваш код. Ваш код действительно сломан. Проблема в вашем коде имеет ту же природу, что и в следующем простом примере

void foo(int i, unsigned j);
void foo(unsigned i, int j);

int main() {
  foo(0, 0);
}

Этот код также не будет компилироваться по той же причине.

2 голосов
/ 23 декабря 2009
GetInput(13, FALSE, 30 * 10);

Я думаю, что

FALSE ==> o ==> NULL is getting converted to std::string(NULL) 

следовательно, он не может определить, какой метод создать.

T0 докажи это проверкой:

GetInput(13, TRUE, 30 * 10); // это работает

1 голос
/ 23 декабря 2009

Чтобы устранить неоднозначность при вызове функции, либо приведите второй параметр к BOOL, либо используйте string("whatever"), если это действительно std :: string.

1 голос
/ 23 декабря 2009

Рассмотрим следующий случай:

BOOL - это typedef of int.

GetString(10,'a'); // compiler get confused in resolving the function

должен ли 'a' быть преобразован в BOOL или строку ???

Когда вы вызываете функцию, передайте правильный аргумент, используя static_cast , чтобы вызвать нужную функцию для вызова.

char ch = 'a';
GetString(10,static_cast<BOOL>(ch)); // calls function with 2nd argument as BOOL

GetString(10,static_cast<string>(ch)); //calls function with 2nd argument as string
1 голос
/ 23 декабря 2009

Возможно, вы передаете этой функции второй параметр, который не является ни BOOL, ни string, но типом, который можно неявно преобразовать в любой из них.

Например, символьный указатель.

...