我使用std :: sort()撞墙。我有一个纯虚拟类(名为Compare
),方法的调用者派生自(名为MyComp
)。我将纯虚拟类用于我的API原型:
void Object::DoSort(Compare &comp) {
std::sort(this->mKeys.begin(),this->mKeys.end(), comp);
}
来电者:
class MyComp: public Compare {
bool operator()(const Row *r1, const Row *r2) { ... }
} cmp;
...
obj->DoSort(cmp);
Linux上的g ++编译器抱怨:“无法分配'Compare'类型的对象,因为'Compare'类型具有抽象虚函数”
即使我将Compare
修改为虚拟(非纯),std::sort()
仍然会调用Compare::operator()
代码,而不是MyComp::operator()
。
调用cmp(r1,r2)编译正确并返回正确的结果。
我必须做错事,否则我不明白。请帮忙!
答案 0 :(得分:8)
std::sort
(和其他STL函数)通过值获取比较器对象,因此正在复制您的对象,但派生的部分(包括其vtbl)正在被“切掉”。
您可以将对象包装在代理中:
class Proxy
{
private:
Compare &cmp;
public:
Proxy(Compare &cmp) : cmp(cmp) {}
bool operator()(const Row *r1, const Row *r2) { return cmp(r1, r2); }
};
...
MyCompare cmp = MyCompare();
std::sort(x.begin(), x.end(), Proxy(cmp));