Lower_bound抛出“错误C2914:'std :: lower_bound':无法推断模板参数,因为函数参数不明确”

时间:2013-08-22 18:51:19

标签: c++ stl lower-bound

在尝试自学STL时,我写了下面的课程:

class Person{
public:
    ...
    bool operator<(const Person& p) const; // sorts by weight
    friend bool compareWeight(const Person &p, const int& wt); //true if wt<p.weight
    friend bool compareWeight(const int& wt, const Person &p);
    ...
private:
    int age;
    int weight;
};

操作员及LT;定义为:

bool Person::operator<(const Person& p) const{
    if (weight<p.weight)
        return true;
    else
        return false;
}

为什么这不起作用:

// get lower_bound for weight = 50
vector<Person>::iterator itr = lower_bound(v.begin(),v.end(),50,compareWeight); 

它抛出:

error C2914: 'std::lower_bound':cannot deduce template argument as function argument is ambiguous

我可以使用假人,权重= 50,然后调用lower_bound:

来解决这个问题
vector<Person>::iterator itr = lower_bound(v.begin(),v.end(), dummy);

但它显然不是很优雅,有人可以帮我比较一下工作吗?此外,在这种情况下关于最佳方法的任何建议都会很棒。请不要使用Boost或C ++ 11,抱歉。

2 个答案:

答案 0 :(得分:3)

您可以提供一个可以执行这两项操作的单个函数对象,而不是提供两个友元函数。

struct CompareWeight {
   bool operator()(const Person&, int) const;
   bool operator()(int, const Person&) const;
};

然后你可以将算法称为:

std::lower_bound(std::begin(v), std::end(v), CompareWeight());

注意:我同意jrok只需要一个重载,但似乎你的实现(不需要完全符合标准)需要另一个方向,如果是这种情况,这提供了一个简单的解决方法。

答案 1 :(得分:1)

编译器需要知道函数的确切签名,以推导lower_bound的最后一个参数。但由于compareWeight超载,因此无法决定采用哪一个。因此,您需要手动转换为正确的函数指针:

typedef bool(*Comp)(const Person&, const int&);
lower_bound(v.begin(),v.end(),50,static_cast<Comp>(&compareWeight)); 

Personaly,我会做你用虚拟参数做的事情。


非主题建议:按值传递基本类型,速度更快。

friend bool compareWeight(const Person &p, int wt);