boost :: priority_queue没有编译

时间:2017-12-08 11:37:20

标签: visual-c++ boost priority-queue

在我的比较操作定义的情况下创建了boost :: priority_queue。这是我的priority_queue的外观,

boost::heap::priority_queue<myObject*, boost::heap::compare<myObjectPtrCompare> > max_heap;

我的比较被定义为,

struct myObjectPtrCompare
{
    bool operator()(const myObject* lhs, const myObject* rhs) const
    {
        return (lhs->getTime() < rhs->getTime());
    }
};

我用它作为,

myObject* obj1 = static_cast<myObject*>(base1);

'base1'是类'myBase'(myObject的基类)的对象

用于比较的

myObject和getTime()定义为,

class myObject : public myBase {
    Time getTime() const { return time; }
.
.
. 
...
}

编译这个给我这个错误,

c:\Projects\pq_test.cpp(27): error C2662: 'void boost::heap::priority_queue<myObject*,boost::heap::compare<myObjectPtrCompare>,boost::parameter::void_,boost::parameter::void_,boost::parameter::void_>::push(myObject *const &)' : cannot convert 'this' pointer from 'const boost::heap::priority_queue<myObject *,boost::heap::compare<myObjectPtrCompare>,boost::parameter::void_,boost::parameter::void_,boost::parameter::void_>' to 'boost::heap::priority_queue<myObject *,boost::heap::compare<myObjectPtrCompare>,boost::parameter::void_,boost::parameter::void_,boost::parameter::void_> &'
1>          Conversion loses qualifiers

使用Visual Studio 2013 C ++。我知道我对const正确性做错了,但我无法弄清楚出了什么问题。任何帮助表示赞赏。

TIA!

EDIT1: @Maxim Egorushkin:谢谢! 我看到了,

myObject* obj1 = static_cast<myObject*>(base1);

是一个函数,它是一个const函数,其签名是

void workOnObj(myBase* base1) const;    

所以,我将priority_queue的定义更改为const as,

const boost::heap::priority_queue<Container*, boost::heap::compare<ContainerPtrCompare> > max_heap;

并且预计错误会消失,但它仍然有相同的错误。

2 个答案:

答案 0 :(得分:0)

错误消息表明代码在priority_queue::push对象上调用非const const priority_queue。您需要一个非const priority_queue对象才能在其上调用push

答案 1 :(得分:0)

如果遇到问题,总是发布一个自包含的示例。您的示例甚至不显示push操作,因此无法生成显示的错误消息。

这是一个简单的示例,显示您的类型有效,因此您可以看到自己的不同做法:

<强> Live On Coliru

#include <boost/heap/priority_queue.hpp>
#include <iostream>
#include <random>

static std::mt19937 s_rng { std::random_device{}() };

struct myObject {
    int _time = s_rng() % 1024;
    int getTime() const { return _time; }
};

struct myObjectPtrCompare {
    bool operator()(myObject const *lhs, myObject const *rhs) const { return lhs->getTime() < rhs->getTime(); }
};

int main() {
    boost::heap::priority_queue<myObject *, boost::heap::compare<myObjectPtrCompare> > max_heap;

    for (auto i = 0u; i < s_rng() % 100; ++i)
        max_heap.push(new myObject{});

    while (max_heap.size()) {
        std::cout << "time: " << max_heap.top()->getTime() << "\n";
        delete max_heap.top();
        max_heap.pop();
    }
}

每次使用随机数据,但会打印类似于:

的内容
time: 1012
time: 994
time: 957
time: 904
time: 889
time: 872
time: 566
time: 460
time: 378
time: 310
time: 254
time: 243
time: 22