G ++ String REMETEN_IF -Fehler
-
27-10-2019 - |
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>)'
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 ändernstring
zustd::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.