К моему удивлению компилируется следующий код:
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
#include <cctype>
int main() {
std::string s="nawaz";
std::string S;
std::transform(s.begin(),s.end(), std::back_inserter(S), ::toupper);
std::cout << S ;
}
Я ожидал, что произойдет сбой из-за ::toupper
, который, как я полагал, должен находиться в пространстве имен std
. Быстрая проверка cctype показывает, что он есть, но он импортирован из корневого nameapce (здесь решена Mystery).
namespace std
{
// Other similar `using` deleted for brevity.
using ::toupper;
}
Итак, первая проблема решена, но если я тоже изменю строку transform()
выше:
std::transform(s.begin(),s.end(), std::back_inserter(S), std::toupper);
Теперь я ожидал бы, что это теперь тоже скомпилируется. Но я получаю ошибку компилятора:
kk.cpp: 12: ошибка: не найдена подходящая функция для вызова преобразования >>, __gnu_cxx :: __ normal_iterator , std :: allocator >>, std :: back_insert_iterator , std :: allocator >>, <<strong> неразрешенная перегруженная функция типа >) '
Что с ручным редактированием тоже разрешено:
kk.cpp:12: error: no matching function for call to
`transform(iterator<std::string>,
iterator<std::string>,
std::back_insert_iterator<std::string>,
<unresolved overloaded function type>)'
Что мне не хватает?