2011-12-03 17 views
5

Ecco il codice:g ++ errore stringa 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()); 
} 

Quando viene compilato in VS 2010, funziona perfettamente bene. Compilato con G ++ che 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>)' 

risposta

13

Aggiungere :: all'inizio del isspace, ispunct e isdigit, in quanto hanno sovraccarichi che il compilatore non può decidere su quale usare:

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

Nella migliore delle ipotesi, le funzioni della libreria C nel namespace globale sono obsolete e obsolete (dovresti includere ""), e nel peggiore dei casi è una strana particolarità del compilatore a cui non si deve fare affidamento. –

+0

@KerrekSB: non mi ero reso conto che era deprecato/hacky, grazie per il suggerimento. – AusCBloke

3

Aggiungi #include <cctype> (e dire std::isspace ecc se non siete abusing namespace std;).

Includere sempre tutte le intestazioni di cui si ha bisogno e non fare affidamento su inclusioni nidificate nascoste.

Potrebbe anche essere necessario disambiguare il sovraccarico dall'altro in <locale>. Fare questo con l'aggiunta di un cast esplicito:

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

per me si compila utilizzando g ++ se faccio una delle seguenti operazioni:

  • rimuovere using namespace std; e cambiareDa 0 a std::string; oppure
  • modifica isspace a ::isspace (ecc.).

Uno di questi causerà isspace (etc.) da prendere dallo spazio principale, anziché essere interpretato nel senso possibilmente std::isspace (ecc).

0

Il problema è che std :: isspace (int) accetta un int come parametro ma una stringa è composta da char. Quindi devi scrivere la tua funzione come:

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

Lo stesso vale per le altre due funzioni.

Problemi correlati