Проблема перегрузки двусмысленности в C ++ - PullRequest
1 голос
/ 29 августа 2011

У меня есть класс FileProc, который выполняет операции ввода-вывода файла.В одном случае я объявил две функции (которые являются подфункциями для оператора = функции), обе из которых имеют решающее значение:

const bool WriteAmount(const std::string &Arr, const long S)
{
    /* Do some string conversion */
    return true;
}

const bool WriteAmount(const char Arr[], unsigned int S)
{
    /* Do some string conversion */
    return true;
}

Если я сделаю вызов с 'символьной строкой' для WriteAmount, он сообщитошибка неоднозначности - говорят, что она перепутана между WriteAmount для строки символов и WriteAmount для std :: string.Я знаю, что происходит под капотом - он пытается использовать конструктор std :: string для неявного преобразования строки char в std :: string.Но я не хочу, чтобы это происходило в случае WriteAmount (то есть, я не хочу, чтобы какое-либо неявное преобразование происходило внутри функций - учитывая, что каждое оптимизировано для каждой роли).

Мой вопрос, длянепротиворечивость, без изменения формата функции (т.е. IE не изменяет количество аргументов или в каком порядке они появляются) и без изменения стандартной библиотеки, есть ли способ предотвратить неявное преобразование в рассматриваемых функциях?

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

Ответы [ 2 ]

5 голосов
/ 29 августа 2011

Вы получаете неоднозначность, потому что ваш второй параметр отличается. Попытка вызвать его с помощью long x = ...; WriteAmount("foo", x) вызовет неоднозначность, поскольку он лучше соответствует второму аргументу с первой перегрузкой, но первый аргумент лучше соответствует второй перегрузке.

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

0 голосов
/ 29 августа 2011

Не можете ли вы изменить второй аргумент и привести его к unsigned int?Он не должен быть в состоянии использовать первый вызов функции.Я не кодировал в C ++ целую вечность ..

...