g ++ string remove_if error - PullRequest
       18

g ++ string remove_if error

6 голосов
/ 03 декабря 2011

Вот код:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
    string word="";
    getline(cin,word);
    word.erase(remove_if(word.begin(), word.end(), isspace), word.end()); 
    word.erase(remove_if(word.begin(), word.end(), ispunct), word.end()); 
    word.erase(remove_if(word.begin(), word.end(), isdigit), word.end());
}

При компиляции в VS 2010 он отлично работает.Скомпилировано с G ++ это говорит:

hw4pr3.cpp: In function `int main()':
hw4pr3.cpp:20: error: no matching function for call to `remove_if(__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> > >, <unknown type>)'
hw4pr3.cpp:21: error: no matching function for call to `remove_if(__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> > >, <unknown type>)'
hw4pr3.cpp:22: error: no matching function for call to `remove_if(__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> > >, <unknown type>)'

Ответы [ 4 ]

15 голосов
/ 03 декабря 2011

Добавьте :: в начало isspace, ispunct и isdigit, так как они имеют перегрузки, которые компилятор не может решить, какой использовать:

word.erase(remove_if(word.begin(), word.end(), ::isspace), word.end()); 
word.erase(remove_if(word.begin(), word.end(), ::ispunct), word.end()); 
word.erase(remove_if(word.begin(), word.end(), ::isdigit), word.end());
4 голосов
/ 03 декабря 2011

Добавьте #include <cctype> (и скажите std::isspace и т. Д., Если вы не abusing namespace std;).

Всегда включайте все нужные заголовки и не полагайтесь на скрытые вложенные включения.

Возможно, вам также придется устранить неоднозначность перегрузки от другой в <locale>.Сделайте это, добавив явное приведение:

word.erase(std::remove_if(word.begin(), word.end(),
                          static_cast<int(&)(int)>(std::isspace)),
           word.end());
2 голосов
/ 03 декабря 2011

Для меня это компилируется с использованием g ++, если я выполняю одно из следующих действий:

  • , удаляем using namespace std; и меняем string на std::string;или
  • замените isspace на ::isspace (и т.интерпретировать как возможное значение std::isspace (и т. д.).
1 голос
/ 03 декабря 2011

Проблема в том, что std :: isspace (int) принимает в качестве параметра int, а строка состоит из char. Поэтому вы должны написать свою собственную функцию как:

bool isspace (char c) {return c == ''; }

То же самое относится и к двум другим функциям.

...