2015-07-23 3 views
6

Я имею:: ToLower против разницы станд :: TOLOWER

using namespace std; 
vector<char> tmp; 
tmp.push_back(val); 
... 

Теперь, когда я пытаюсь

transform(tmp.begin(), tmp.end(), tmp.begin(), std::tolower); 

Он не может скомпилировать, но компилирует:

transform(tmp.begin(), tmp.end(), tmp.begin(), ::tolower); 

Что проблема с std::tolower? Он работает с одним аргументом, например, std::tolower(56) компиляции. Благодаря!

+1

Связанных/дубликат: http://stackoverflow.com/q/5270780/ (см второго ответа HTTP: // StackOverflow. com/a/5270970 /) – dyp

+0

@dyp Итак, если 'std :: lower' нуждается в двух аргументах, как работает' std :: tolower (56) '? – hovo

+1

'std :: tolower' перегружен, есть две функции (одна [функция из библиотеки C] (http://en.cppreference.com/w/cpp/string/byte/tolower) принимает один аргумент и [один function template] (http://en.cppreference.com/w/cpp/locale/tolower), который принимает два аргумента) с именем 'tolower' в пространстве имен' std'. В глобальном пространстве имен, если есть что-либо, тогда это только «библиотека» библиотеки C, которая принимает один аргумент. – dyp

ответ

3

std::tolower имеет две перегрузки и не может быть разрешен для UnaryOperation, где версия C ::tolower нет.

Если вы хотите использовать std::tolower вы можете использовать лямбду

transform(tmp.begin(), tmp.end(), tmp.begin(), [](unsigned char c) {return std::tolower(c); }); 
+3

Существует также унарный 'std :: tolower', вам просто нужно устранить неоднозначность. –

+0

@BaummitAugen, можно ли его устранить с помощью '& std :: tolower'? –

+0

@AaronMcDaid Я так не думаю, но вы можете попробовать, если хотите. :) –

Смежные вопросы