проблемы с использованием STL std::transform из cygwin g++

Я запускаю g++ (версия gcc 3.4.4) на cygwin.

Я не могу скомпилировать этот небольшой фрагмент кода. Я включил соответствующие заголовки.

int main(){

    std::string temp("asgfsgfafgwwffw");

    std::transform(temp.begin(),
                   temp.end(),
                   temp.begin(),
                   std::toupper);

    std::cout << "result:" << temp << std::endl;

    return 0;
}

У меня не было проблем с использованием контейнеров STL, таких как вектор. У кого есть какие предложения или идеи по этой ситуации. Спасибо.


person Pradyot    schedule 29.08.2009    source источник
comment
Не могли бы вы также опубликовать сообщения об ошибках?   -  person avakar    schedule 29.08.2009
comment
каковы соответствующие заголовки и какую ошибку вы получаете? С тем же успехом ваш вопрос может заключаться в том, что я пишу правильный код, но он не работает. Что случилось? Нам нужно знать 1) что вы делаете и 2) в чем ошибка.   -  person jalf    schedule 29.08.2009
comment
Отличное объяснение этой проблемы (и ее решение) здесь.   -  person David C    schedule 18.08.2012


Ответы (2)


Это довольно хорошо объясняет.

Что будет сводиться к этому коду:

std::transform(temp.begin(),temp.end(),temp.begin(),static_cast<int (*)(int)>(std::toupper));
person Ryan    schedule 29.08.2009
comment
пожалуйста, объясните проблему в сообщении. Внешние статьи могут быть снесены, и тогда ваш ответ будет бесполезен. Кроме того, всем нам неприятно переходить по внешней ссылке только для того, чтобы узнать, правильный ли ваш ответ или нет. - person jalf; 29.08.2009
comment
Прошу прощения за то, что пропустил это очевидное решение. - person Pradyot; 29.08.2009

По ссылке выше.

#include <cctype> // for toupper
#include <string>
#include <algorithm>
using namespace std;

void main()
{
string s="hello";
transform(s.begin(), s.end(), s.begin(), toupper);
}

Увы, приведенная выше программа не скомпилируется, потому что имя 'toupper' неоднозначно. Это может относиться либо к:

int std::toupper(int); // from <cctype>

or

template <class chart> 
  charT std::toupper(charT, const locale&);// from 
  <locale>

Используйте явное приведение для устранения неоднозначности:

std::transform(s.begin(), s.end(), s.begin(), 
               (int(*)(int)) toupper);

Это даст указание компилятору выбрать правильный метод toupper().

person Community    schedule 23.11.2009