Проблема заключается в неоднозначности, представленной шаблоном функции
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
на самом деле препятствует отрицательным числам.