如评论中所述,您缺少包含std::isspace
,即<cctype>
。但即便如此,您也不会成功,因为 isspace 已超载,请参见此处。
重载问题的解决方案是将函数指针显式转换为所需的函数签名:
str.erase(remove_if(str.begin(), str.end(), static_cast<int(*)(int)>(&std::isspace)),str.end());
但是,正如评论中所指出的,如果此处使用的字符是非 ASCII 字符isspace
,则具有未定义的行为。在这种情况下,最好使用将语言环境作为第二个参数的模板版本:
C++14:
str.erase(
remove_if(str.begin(), str.end(),
[](auto c){ return isspace(c, cin.getloc());}
),
str.end());
C++11:如上所述,lambda 以 achar c
作为参数(C++11 中没有多态 lambda)。
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());
没有 boost 的 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());