Ошибка: запрос на член '..' в '..', который не относится к классу

Я использую 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}};

И получить объект, как и следовало ожидать.

Другие вопросы по тегам