priority_queue常数表达

priority_queue constant expression

本文关键字:常数表 queue priority      更新时间:2023-10-16

在代码中如下所示:

比较算法

class PathComp{
public:
virtual bool betterThan(const PathInfo& path1, const PathInfo& path2) const{
//returns true if path1 is shorther than path2
{
};

具有重新定义的运算符 () 的类

class QueueComp{
private:
PathComp* comp;
public:
QueueComp(PathComp* pc);
bool operator () (const pair<PathInfo, string>& item1, const pair<PathInfo, string> item2);
};
QueueComp::QueueComp(PathComp* pc):comp(pc){}
bool QueueComp::operator () (const pair<PathInfo, string>& item1, const pair<PathInfo, string>& item2){
    return comp->betterThan(item1.first, item2.first);
}

使用优先级队列的函数

list<string> Graph::shortestPath(const string& from, const string& to, PathComp* pc) const{
    const QueueComp comp(pc);
    std::priority_queue<pair<PathInfo, string>, set<pair<PathInfo, string> >, comp> q;
}

编译器显示错误消息:"comp"不能出现在常量表达式中, 模板参数 3 无效, 前面的声明中键入无效 ;令 牌

有谁知道问题出在哪里?感谢所有的帮助。

编译器已经说明了问题所在:非constexpr不能是模板参数。你可能想写

std::priority_queue<std::pair<PathInfo, std::string>,
                    std::vector<std::pair<PathInfo, std::string> >,
                    QueueComp>
    q(comp);

直接的问题是comp是一个对象,但模板需要比较函数的类型。一旦解决这个问题,下一个问题将是std::set<...>不是一个可行的容器,可以与std::priorit_queue<...>一起使用,但std::vector<...>是。