Что здесь происходит с Cctype? - PullRequest
14 голосов
/ 23 марта 2011

К моему удивлению компилируется следующий код:

#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>)'

Что мне не хватает?

Ответы [ 2 ]

11 голосов
/ 23 марта 2011

Не работает, потому что есть перегрузки std::toupper.Вы можете исправить это, приведя к желаемой функции перегрузки:

std::transform(s.begin(),s.end(), std::back_inserter(S),
                (int(&)(int))std::toupper);
4 голосов
/ 23 марта 2011

Вам не хватает того, что C ++ также добавляет новые toupper функции в <locale>, которые, вероятно, неявно включены одним из ваших других заголовков.Таким образом, в пространстве имен std:: есть несколько перегрузок, в то время как в глобальном пространстве имен есть только старая версия функции на языке С.

...