Ошибка: запрос на член '..' в '..', который не относится к классу
Я использую STL priority_queue
и дать пользовательский класс компаратора, конструктор которого принимает указатель на вектор, который хранит приоритеты, таким образом -
#include <iostream>
#include <queue> // std::priority_queue
#include <vector> // std::vector
using namespace std;
class CompareReachDist
{
const vector<float> *reach_dists;
public:
CompareReachDist(const vector<float> *input)
{
reach_dists = input;
}
bool operator() (const size_t &l, const size_t &r) const
{
return (reach_dists->at(l) > reach_dists->at(r));
}
};
typedef priority_queue<size_t, vector<size_t>, CompareReachDist> pq;
vector<float> reach_dists;
int main()
{
pq seeds(CompareReachDist(&reach_dists));
bool isEmpty = seeds.empty();
return 0;
}
Однако при компиляции я получаю ошибку:
error: request for member 'empty' in 'seeds', which is of non-class type 'pq(CompareReachDist&) {aka std::priority_queue<unsigned int std::vector<unsigned int>, CompareReachDist>(CompareReachDist&)}'
Куда я иду не так?
1 ответ
Это проблема разбора. Давайте разберем это на части:
CompareReachDist(&reach_dists)
Вы можете подумать, что это создает временную CompareReachDist
с адресом статического reach_dists
, Но в контексте общей декларации оно интерпретируется как ссылка на CompareReachDist
, Странно, но это потому, что, грубо говоря, грамматика C++ предпочитает объявления функций объявлениям объектов. Следующие
pq seeds(CompareReachDist(&reach_dists));
Это полное объявление функции. Он принимает CompareReachDist&
и возвращает pq
,
Вы получаете ошибку, потому что, очевидно, функция не имеет empty
член вы можете позвонить.
Решение, начиная с C++11, заключается в предпочтении инициализации списка, которая нарушает неоднозначность и ее разрешение в виде объявления функции. Так что вы можете сделать это:
pq seeds{CompareReachDist{&reach_dists}};
И получить объект, как и следовало ожидать.