Почему ptr_fun (tolower) не компилируется в mingw? - PullRequest
5 голосов
/ 30 октября 2010

Я пытаюсь скомпилировать следующую программу, используя Qt Creator 2.0.1:

void f()
{
    string a = "abc";
    transform(a.begin(), a.end(), a.begin(), ptr_fun(tolower));
}

mingw выдает следующую ошибку:

нет функции для вызова ptr_fun(<неразрешенный тип перегруженной функции>)

Эта функция прекрасно работает с VC ++ 2010 Express.Что не так с Mingw?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 30 октября 2010

Проблема заключается в неоднозначности, представленной шаблоном функции

template <class charT> charT tolower(charT c, const locale& loc);

Я полагаю, что mingw косвенно включил <locale> из одного из заголовков, включенных в вашу программу, тогда как VC ++ этого не сделал.

Вы можете исправить это, устраняя неоднозначность tolower с помощью приведения:

typedef int (*foo)(int);
ptr_fun((foo)tolower);

Или, если вы хотите, чтобы программисты по техническому обслуживанию бросали вам обувь:

ptr_fun((int (*)(int))tolower);

Обратите внимание, что, как говорит Армен, вам на самом деле не нужен ptr_fun здесь. Он преобразует унарную функцию в адаптируемую унарную функцию, но для transform ее параметр не нуждается в адаптации. Разница в том, имеет ли тип вложенные typedefs для argument_type и result_type. Необработанные типы функций не делают, ptr_fun возвращает тип функтора, который делает.

Наконец, вообще не безопасно вызывать C tolower на char, если char подписано на вашей платформе. Ваш пример строки в порядке, потому что ни один из символов в «abc» не является отрицательным, но вы должны сделать что-то вроде этого:

char fixed_tolower(char c) {
    return tolower((unsigned char)c);
}

transform(..., fixed_tolower);

Или для лучшего шанса вставки:

struct fixed_tolower : unary_function<char, char> {
    char operator()(char c) const {
        return tolower((unsigned char)c);
    }
};

transform(..., fixed_tolower());

Я не проверял, имеет ли это какое-либо отличие в GCC, от POV для встраивания или от POV того, действительно ли реализация mingw tolower на самом деле препятствует отрицательным числам.

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

Почему бы вам просто не позвонить

transform (a.begin, a.end(), a.begin(), tolower);

?

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

С mingw все в порядке.Есть несколько перегрузок для tolower, генерирующих сообщение "unreolved overloaded function.

Вам необходимо указать , какую перегрузку вы хотите использовать, например, через некоторое приведение(int)(*)(char)tolower или промежуточная переменная.

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