使用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
相关产品推荐
相关产品推荐

