【发布时间】:2014-07-28 13:53:40
【问题描述】:
我想计算std::string 中的空格。 std::count_if 的任务非常简单,所以我写了这段代码:
std::cout<<std::count_if(str.cbegin(), str.cend(), &std::isspace);
和...编译器错误(xcode):No matching function for call to 'count_if'
我改成:
std::cout<<std::count_if(str.cbegin(), str.cend(), &isspace);
并且编译器错误不再存在。
你能解释一下第一行有什么问题吗?当函数位于命名空间中时获取函数指针时我是否遗漏了什么?这是否与 ADL 相关,因为 isspace 和 count_if 来自同一个命名空间?
编辑:
完整的构建日志:
Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/c++/v1/algorithm:1097:1: 候选模板被忽略:无法推断模板参数 '_谓词'
【问题讨论】:
-
我敢打赌,您显示的错误消息不是构建日志中的唯一消息。请显示完整的日志。
-
您不能安全地这样做,因为
std::isspace可能会超载。同样不安全的是盲目地将chars 传递给它。您应该使用显式调用std::isspace的东西(例如 lambda),并将char转换为unsigned char。 -
@chris 我的第一个实现使用了 lambda,但我只是从 isspace 返回结果,这似乎有点矫枉过正。现在我很感兴趣,为什么当我没有完全限定函数时会有区别......
标签: c++ c++11 namespaces function-pointers