コメントに示されているように、 のインクルードstd::isspace
、つまりがありません<cctype>
。しかし、それでも isspace がオーバーロードされているため、成功しませんこちら を参照してください。
オーバーロードの問題の解決策は、関数ポインタを目的の関数シグネチャに明示的にキャストすることです。
str.erase(remove_if(str.begin(), str.end(), static_cast<int(*)(int)>(&std::isspace)),str.end());
ただし、コメントで指摘されているように、ここで使用される は、 ASCII 以外の文字を取得した場合isspace
の動作が未定義です。その場合、ロケールを 2 番目のパラメーターとして取るテンプレート化されたバージョンを使用することをお勧めします。
C++14:
str.erase(
remove_if(str.begin(), str.end(),
[](auto c){ return isspace(c, cin.getloc());}
),
str.end());
C++11:上記のように、ラムダがchar c
パラメーターとして使用されます (C++11 にはポリモーフィック ラムダはありません)。
C++03 with boost:boost::bind
の述語の作成に使用remove_if
str.erase(
remove_if(str.begin(), str.end(),
boost::bind(&std::isspace<char>, _1, boost::ref(cin.getloc()))
),
str.end());
ブーストなしの C++03:手書きのファンクターを述語として定義する
struct IsSpace {
bool operator()(char c) {
return std::isspace(c, cin.getloc());
}
};
str.erase(
remove_if(str.begin(), str.end(),
IsSpace()
),
str.end());