2011-12-03 19 views
5

Aquí está el código:g ++ error cadena remove_if

#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()); 
} 

Cuando compilado en VS 2010, funciona perfectamente bien. Compilado con G ++ que dice:

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

Respuesta

13

Añadir :: al principio de isspace, ispunct y isdigit, ya que tienen sobrecargas que el compilador no puede decidir sobre qué usar:

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()); 
+0

En el mejor de los casos, tener las funciones de la biblioteca C en el espacio de nombres global está obsoleto y heredado (debería incluir '') y, en el peor, solo es una extraña peculiaridad del compilador que no se debe confiar. –

+0

@KerrekSB: No me di cuenta de que estaba obsoleto/hacky, gracias por la sugerencia. – AusCBloke

3

Añadir #include <cctype> (y dicen std::isspace etc, si usted no está abusing namespace std;).

Siempre incluya todos los encabezados que necesite y no confíe en inclusiones ocultas ocultas.

También puede que tenga que eliminar la ambigüedad de la sobrecarga de la otra en <locale>. Para ello, agregue una conversión explícita:

word.erase(std::remove_if(word.begin(), word.end(), 
          static_cast<int(&)(int)>(std::isspace)), 
      word.end()); 
2

para mí que se compila utilizando g ++ si hago una de las siguientes:

  • using namespace std; quitar y cambiar string a std::string; o
  • cambie isspace a ::isspace (etc.).

Cualquiera de estos causar isspace (etc.) que deben tomarse desde el espacio de nombres principal, en lugar de ser interpretado como que posiblemente significa std::isspace (etc.).

0

El problema es que std :: isspace (int) toma un int como parámetro pero una cadena se compone de char. Por lo tanto, debe escribir su propia función como:

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

Lo mismo se aplica a las otras dos funciones.

Cuestiones relacionadas