константа priority_queue

В коде выглядит так:

алгоритм сравнения

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

Решение

Компилятор уже говорит, в чем проблема: не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<...> является.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]