在代码中看起来像这样:
比较算法
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无效, 声明中的无效类型;令牌
有人知道问题在哪里吗?感谢您的帮助。
答案 0 :(得分:1)
编译器已经说明了问题所在:非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<...>
是。