Перегрузка функций c ++ с помощью bool и const char создает двусмысленность без предупреждения (MSVC2012) - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть две функции для обработки ошибок возвращаемого значения:

static void handleError(int error, const std::string& message, bool bShowAll = false);

и

static void handleError(int error, const std::string& prefix, const std::string& message, bool bShowAll = false)

вызов этой функции, который у меня есть проблема, выглядит следующим образом:

handleError(errro, "moduleA", "query failed");

Теперь возникает проблема: приведенный выше вызов приводит к вызову первого варианта вместо второго с параметром передачи bShowAll, разрешенным в значение «истина». Я думаю, что const char [] совместим с типом bool.

Я попытался изменить порядок функций (используя предварительное объявление для второй), но это не помогло вообще. какие еще варианты предлагает С ++ для решения этой проблемы? (если бы все типы приведения типов не работали - использование другого типа, отличного от bool, например, enum-тип с enum-символами-эквивалентами для того, для чего предназначен bool, перешло в хорошую операцию. это открыло двери для этого, но сам MSVC 2012 не намекал на эту двусмысленность, несмотря на то, что я запускаю его с уровнем предупреждения до # 4.)

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

1 Ответ

0 голосов
/ 10 сентября 2018

Проблема в том, что "query failed" имеет тип const char[], его необходимо преобразовать в std::string для вызова handleError. Это пользовательское преобразование, которое имеет более низкий рейтинг, чем стандартное преобразование (от const char[] до const char* и до bool).

Вы можете сделать так, чтобы он явно передавал std::string, чтобы избежать неявного пользовательского преобразования.

handleError(errro, std::string("moduleA"), std::string("query failed"));

Или с C ++ 14

using namespace std::string_literals;
handleError(errro, "moduleA"s, "query failed"s);
...