【问题标题】:boost::priority_queue not compilingboost::priority_queue 未编译
【发布时间】: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;

并期望错误会消失,但它仍然有相同的错误。

【问题讨论】:

  • 推送从何而来?按原样显示相关代码。

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


【解决方案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::parameter::void_,boost::parameter::void_,boost::parameter::void_>' 正在编译中
    • 您仍然没有添加任何代码,更糟糕的是,您抱怨您没有显示的错误消息。我为什么要花时间在这上面?反正我不是通灵者。
    • 叹息。我见过your new question(答案是正确的)。这个答案有什么帮助吗?如果您的问题不完整,您不能责怪他人,并且不将这个问题编辑为完整的,您实际上浪费了人们的时间。另请参阅meta.stackexchange.com/questions/5234/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    相关资源
    最近更新 更多