Error G ++ String RemoLE_IF
-
27-10-2019 - |
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>)'
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 cambiostring
astd::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.