Я думал, что понял это, но, думаю, я ошибался. У меня сложилось впечатление, что первый элемент в<…> ‘- это тип, который должен храниться в очереди, второй — это тип контейнера (варианты выбора’ vector ‘или’ dequeue ‘), а третий — это класс, который перегружает оператор’ () ‘для сравнение. Исходя из этого, я думаю, что следующий код должен компилироваться, но это не так 🙁
std::priority_queue<uint32_t*, std::vector<uint32_t*>, edgeComparator> q();
uint32_t* nodeEdge = new uint32_t[2];
nodeEdge[0] = startN;
nodeEdge[1] = 0;
q.push(nodeEdge);
‘edgeComparator’ определяется следующим образом:
class edgeComparator
{
public:
bool operator() (const uint32_t*& lhs, const uint32_t*& rhs) const
{
return (lhs[1]>rhs[1]);
}
};
Вот ошибка, которую я получаю:
./Graph.cpp: In member function `void Graph::findShortestPath()':
./Graph.cpp:148: error: request for member `push' in `q', which is of non-class type `std::priority_queue<uint32_t*, std::vector<uint32_t*, std::allocator<uint32_t*> >, edgeComparator> ()()'
Хуже того, я также получаю эту ошибку при попытке ‘q.empty ()’
./Graph.cpp:150: error: request for member `empty' in `q', which is of non-class type `std::priority_queue<uint32_t*, std::vector<uint32_t*, std::allocator<uint32_t*> >, edgeComparator> ()()'
Ты имел:
std::priority_queue<uint32_t*, std::vector<uint32_t*>, edgeComparator> q();
Но вместо этого вы должны использовать:
std::priority_queue<uint32_t*, std::vector<uint32_t*>, edgeComparator> q;
Первая версия объявляет функция названный q
, который не принимает аргументов и возвращает значение типа std::priority_queue<...>
,
Вторая версия объявляет переменная названный q
типа std::priority_queue<...>
, который инициализируется по умолчанию.
Других решений пока нет …