find_if()与模板?

时间:2017-05-26 14:25:12

标签: c++ templates

我是C ++的新手,我尝试将find_if与模板一起使用,但它似乎并没有按我想要的方式工作。这是为什么?我试图在之前提出的有关迭代器模板的问题中找到答案,但我想我错过了正确的答案,或者可能只是没有正确理解答案。我尝试在迭代器之前使用typename,但这并没有改变错误消息。

是否有更好的方法可以做到这一点,如果有,有人可以帮我学习如何做到这一点吗?

  

(错误消息:错误C3867:' UserInterface :: Number':函数调用缺少参数列表,使用'& Userinterface :: Number'创建指向成员的指针)=

当发生这种情况时,我知道在函数调用之后我已经错过了(),但这次并非如此?!

#include <iostream>     // std::cout
#include <algorithm>    // std::find_if
#include <vector>       // std::vector

template<typename T>
class UserInterface
{
public:
bool Number(int i);
void function();
};

template<typename T>
bool UserInterface<T>::Number(int i) {
return (i >= 40);
}

template<typename T>
void UserInterface<T>::function()
{
std::vector<T> myvector;

myvector.push_back(10);
myvector.push_back(25);
myvector.push_back(15);
myvector.push_back(55);
myvector.push_back(1);
myvector.push_back(65);
myvector.push_back(40);
myvector.push_back(5);

std::vector<T>::iterator it = std::find_if(myvector.begin(), myvector.end(), Number);
std::cout << "The first value over 40 is " << *it << '\n';

std::cin.get();
}

int main() {
UserInterface<int> fu;
fu.function();

return 0;
}

1 个答案:

答案 0 :(得分:-1)

您的示例存在一些问题。第一个是std::find_if与非静态成员方法指针不兼容。那些指针需要this才能工作。由于UserInterface::Number不访问任何非静态成员并且不调用任何非静态方法,因此您可以将其设置为静态。

第二个问题是你必须使用&来获取指向你的函数的指针。

最后,请不要忘记std::vector<T>::iterator之前的typename

#include <iostream>     // std::cout
#include <algorithm>    // std::find_if
#include <vector>       // std::vector

template<typename T>
class UserInterface
{
public:
    static bool Number(int i);
//  ^^^^^^ Add static here
    void function();
};

template<typename T>
bool UserInterface<T>::Number(int i) {
    return (i >= 40);
}

template<typename T>
void UserInterface<T>::function()
{
    std::vector<T> myvector;

    myvector.push_back(10);
    myvector.push_back(25);
    myvector.push_back(15);
    myvector.push_back(55);
    myvector.push_back(1);
    myvector.push_back(65);
    myvector.push_back(40);
    myvector.push_back(5);

    typename std::vector<T>::iterator it = 
//  ^^^^^^^^ typename here
    std::find_if(myvector.begin(), myvector.end(), &Number);                                            
//                                                 ^
    std::cout << "The first value over 40 is " << *it << '\n';

    std::cin.get();
}

int main() {
    UserInterface<int> fu;
    fu.function();

    return 0;
}