std :: transform () y toupper (), no hay función de coincidencia

Intenté el código de esta pregunta C ++ std :: transform () y toupper () ... ¿por qué falla esto?

#include <iostream>
#include <algorithm>

int main() {
  std::string s="hello";
  std::string out;
  std::transform(s.begin(), s.end(), std::back_inserter(out), std::toupper);
  std::cout << "hello in upper case: " << out << std::endl;
}

eóricamente debería haber funcionado, ya que es uno de los ejemplos en el libro de Josuttis, pero no compilahttp: //ideone.com/aYnf.

Por qué se quejó GCC:

no matching function for call to ‘transform(
    __gnu_cxx::__normal_iterator<char*, std::basic_string
        <char, std::char_traits<char>, std::allocator<char> > >, 
    __gnu_cxx::__normal_iterator<char*, std::basic_string
        <char, std::char_traits<char>, std::allocator<char> > >, 
    std::back_insert_iterator<std::basic_string
        <char, std::char_traits<char>, std::allocator<char> > >,
    <unresolved overloaded function type>)’

¿Me estoy perdiendo de algo? ¿Es un problema relacionado con el CCG?

Respuestas a la pregunta(2)

Su respuesta a la pregunta