在<algorithm>库中使用find_if作为谓词的函数要求是什么?</algorithm>

时间:2015-01-15 19:16:39

标签: c++ algorithm

我无法判断我是否只是遗漏了一些明显的东西,但我似乎无法让find_if工作。

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

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

int main()
{
    string text = "This is the text";

    string::iterator it = find_if(text.begin(), text.end(), isspace);

    cout << *it << endl;

    return 0;
}

我已经看过这里的例子http://www.cplusplus.com/reference/algorithm/find_if/,它编译并运行但我看不出它与我的程序之间的区别,而不是矢量 - &gt;字符串的东西,但我不明白为什么会产生影响。

我知道cctype具有更好的isspace功能,但我想确保它不会搞砸我。

我的错误:

test.cpp: In function ‘int main()’:
test.cpp:16:68: error: no matching function for call to ‘find_if(std::basic_string<char>::iterator, std::basic_string<char>::iterator, <unresolved overloaded function type>)’
     string::iterator it = find_if(text.begin(), text.end(), isspace);
                                                                    ^
test.cpp:16:68: note: candidate is:
In file included from /usr/include/c++/4.8/algorithm:62:0,
                 from test.cpp:3:
/usr/include/c++/4.8/bits/stl_algo.h:4456:5: note: template<class _IIter, class _Predicate> _IIter std::find_if(_IIter, _IIter, _Predicate)
     find_if(_InputIterator __first, _InputIterator __last,
     ^
/usr/include/c++/4.8/bits/stl_algo.h:4456:5: note:   template argument deduction/substitution failed:
test.cpp:16:68: note:   couldn't deduce template parameter ‘_Predicate’
     string::iterator it = find_if(text.begin(), text.end(), isspace);
                                                                    ^

1 个答案:

答案 0 :(得分:6)

错误的关键部分是:

test.cpp:16:68: error: no matching function for call to ‘find_if(
    std::basic_string<char>::iterator, 
    std::basic_string<char>::iterator, 
    <unresolved overloaded function type>)’ // <==

未解决的重载功能类型!?那是因为你定义了:

bool isspace(char );

但已经有一个名为isspace

bool isspace(int );

以及using带来的另一个名为std::isspace的内容:

template <class charT>
bool isspace(charT, const locale&);

模板无法知道你想要哪一个。所以你可以明确指定它:

string::iterator it = find_if(
    text.begin(), 
    text.end(), 
    static_cast<bool(*)(char)>(isspace)); // make sure yours gets called

或者,更简单,只需更改您的名字即可。

或者,最简单的,只需删除您的停止 using namespace std;即可。这样,isspace毫不含糊地明确地引用了您想要首先使用的一个函数。