boost::priority_queue 未编译
Posted
技术标签:
【中文标题】boost::priority_queue 未编译【英文标题】:boost::priority_queue not compiling 【发布时间】:2017-12-08 11:37:20 【问题描述】:创建了一个 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!
编辑1: @Maxim Egorushkin:谢谢! 我看到了,
myObject* obj1 = static_cast<myObject*>(base1);
在一个函数中,该函数是一个 const 函数,其签名是,
void workOnObj(myBase* base1) const;
所以,我将我的 priority_queue 的定义更改为 const,
const boost::heap::priority_queue<Container*, boost::heap::compare<ContainerPtrCompare> > max_heap;
并期望错误会消失,但它仍然有相同的错误。
【问题讨论】:
推送从何而来?按原样显示相关代码。 【参考方案1】:错误消息表明代码在 const priority_queue
对象上调用非 const priority_queue::push
。您需要一个非常量的 priority_queue
对象才能在其上调用 push
。
【讨论】:
【参考方案2】:如果遇到麻烦,总是发布一个独立的示例。您的示例甚至没有显示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
【讨论】:
对不起,我的错......我应该添加一个无效的例子。现在解决了我最初遇到的问题,这是因为我试图在 const 函数中添加到 priority_queue。现在,当我编译它时,我有警告(我们将它们视为错误), 对不起,我的错......我应该添加一个无效的例子。现在解决了我最初遇到的问题,这是因为我试图在 const 函数中添加到 priority_queue。现在,当我将其编译为 1> c:\Projects\priority_queue_example.h(193) 时,我有警告(我们将它们视为错误):请参阅对类模板实例化的引用 'boost::heap::priority_queue以上是关于boost::priority_queue 未编译的主要内容,如果未能解决你的问题,请参考以下文章
是否需要在同一环境中使用同一编译器对同一程序进行编译之间保持一致的未指定和未定义行为?