Frage

Hier ist der Code:

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

Wenn es in VS 2010 zusammengestellt wird, funktioniert es vollkommen in Ordnung. Zusammengestellt mit G ++: Es heißt:

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>)'
War es hilfreich?

Lösung

Hinzufügen :: zu Beginn von isspace, ispunct und isdigit, Da sie Überlastungen haben, über die der Compiler nicht entscheiden kann, welcher zu verwenden ist:

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

Andere Tipps

Hinzufügen #include <cctype> (und sag std::isspace usw. Wenn Sie nicht sind abusing namespace std;).

Fügen Sie immer alle Header, die Sie benötigen, immer ein und verlassen Sie sich nicht auf versteckte verschachtelte Einschlüsse.

Möglicherweise müssen Sie die Überlastung auch von der anderen in der In -in -Vergrößerung einsetzen <locale>. Tun Sie dies, indem Sie eine explizite Besetzung hinzufügen:

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

Für mich kompiliert es mit G ++, wenn ich eines der folgenden mache:

  • Löschen using namespace std; und ändern string zu std::string; oder
  • Rückgeld isspace zu ::isspace (etc.).

Eine dieser wird verursachen isspace (etc.) aus dem Hauptnamenspace entnommen zu werden, anstatt als möglicherweise Bedeutung interpretiert zu werden std::isspace (etc.).

Das Problem ist, dass std :: isspace (int) einen INT als Parameter nimmt, aber eine Zeichenfolge besteht aus Zeichen. Sie müssen also Ihre eigene Funktion schreiben als:

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

Gleiches gilt für die beiden anderen Funktionen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top