Pregunta

Aquí está el código:

#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 se compila en VS 2010, funciona perfectamente bien. Compilado con g ++ 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>)'
¿Fue útil?

Solución

Agregar :: al comienzo 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());

Otros consejos

Agregar #include <cctype> (y decir std::isspace etc. Si no lo eres abusing namespace std;).

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

También es posible que deba desambiguar la sobrecarga del otro en <locale>. Haga esto agregando un elenco explícito:

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

Para mí, se compila usando G ++ si hago cualquiera de los siguientes:

  • retirar using namespace std; y cambio string a std::string; o
  • cambio isspace a ::isspace (etc.).

Cualquiera de estos causará isspace (etc.) para ser tomados del espacio de nombres principal, en lugar de ser interpretado como posiblemente significado std::isspace (etc.).

El problema es que std :: isspace (int) toma un int como parámetro, pero una cadena está compuesta de char. Entonces tienes que escribir tu propia función como:

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

Lo mismo se aplica a las otras dos funciones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top