calling a Binary Predicate

问题描述 投票:0回答:1
#include <iostream>
#include <iterator>
#include <vector>

using namespace std;

template<typename Iter1, typename Iter2>
bool pred(Iter1 it1, Iter2 it2){
    if(*it1 == *it2)
        return true;
    return false;
}

template<typename FwdIter1, typename InIter2, typename BinPred>
bool contains(FwdIter1 first1, FwdIter1 last1, InIter2 first2, InIter2 last2, BinPred pred){
    for(InIter2 it2 = first2; it2 != last2; ++it2){
        for(InIter2 it1 = first1; it1 != last1; ++it1){
            if(pred(it1, it2)){
                return true;
            }
        }
    }
    return false;
}

int main()
{
    vector<int> v1 {2, 5, 6, 8};
    vector<int> v2 {1, 2, 3, 10};
    if (contains(v1.begin(), v1.end(), v2.begin(), v2.end(), pred))
        cout << "Element found" << '\n';
    else
        cout << "Element not found \n";
    return 0;
}

为什么会这样?

error: no matching function for call to 'contains(std::vector<int>::iterator, std::vector<int>::iterator, std::vector<int>::iterator, std::vector<int>::iterator, < unresolved overloaded function type >)'
c++ templates
1个回答
0
投票

您必须为pred指定模板参数,例如

if (contains(v1.begin(), v1.end(), v2.begin(), v2.end(), 
             pred<decltype(v1.begin()), decltype(v2.begin())>))

LIVE

© www.soinside.com 2019 - 2024. All rights reserved.