You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用std::lower_bound时非静态成员比较函数编译错误求助

解决std::lower_bound调用非静态成员函数的编译错误

这个错误的核心原因很明确:你传递给std::lower_bound的compare_email是PersonsDB的非静态成员函数,这类函数隐含了一个指向当前对象的this指针参数,而std::lower_bound期望的是一个不需要额外对象上下文就能调用的可调用对象(比如普通函数、静态成员、lambda等)。下面给你三种可行的解决方案,按推荐程度排序:

方案1:改用Lambda表达式(最简洁推荐)

Lambda可以直接捕获当前PersonsDB对象的上下文,完美适配std::lower_bound的要求,同时不需要修改原有的compare_email成员函数:

vector<Person*>::iterator PersonsDB::email_exists(const string & email) {
    // 用栈对象代替new,避免内存泄漏!
    Person dummy_person("", "", email, 0);
    auto i = lower_bound(__emails.begin(), __emails.end(), &dummy_person,
        // 捕获this,调用成员函数做比较
        [this](Person* a, Person* b) {
            return this->compare_email(a, b);
        }
    );
    if (i != __emails.end() && !(dummy_person.email() < (*i)->email()))
        return i;
    else
        return __emails.end();
}

顺便提一句:你原来用new创建dummy对象会导致内存泄漏,改成栈上对象更安全,不需要手动delete。

方案2:把compare_email改成静态成员函数

静态成员函数没有隐含的this指针,可以直接作为参数传递给std::lower_bound。修改方式很简单,在函数声明和定义前加上static:

// 类声明里修改
class PersonsDB {
private:
    static bool compare_email(Person * person_1, Person * person_2);
    // ...其他成员
};

// 定义也加上static
bool PersonsDB::compare_email(Person * person_1, Person * person_2) {
    return person_1->email() < person_2->email();
}

// 调用时直接传compare_email即可
vector<Person*>::iterator PersonsDB::email_exists(const string & email) {
    Person dummy_person("", "", email, 0);
    auto i = lower_bound(__emails.begin(), __emails.end(), &dummy_person, compare_email);
    // ...后续逻辑不变
}

注意:静态成员函数不能访问类的非静态成员,但你的compare_email只用到Person的成员,所以完全没问题。

方案3:用std::bind绑定成员函数

这种方式稍显繁琐,但也是可行的,需要包含<functional>头文件:

#include <functional>

vector<Person*>::iterator PersonsDB::email_exists(const string & email) {
    Person dummy_person("", "", email, 0);
    auto comparator = bind(&PersonsDB::compare_email, this, placeholders::_1, placeholders::_2);
    auto i = lower_bound(__emails.begin(), __emails.end(), &dummy_person, comparator);
    // ...后续逻辑不变
}

std::bind会把当前对象的this指针和成员函数绑定,生成一个可调用对象供lower_bound使用。

内容的提问来源于stack exchange,提问作者Gethvi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:42:40