错误:请求会员' ..' in' ..' ,这是非类型的

时间:2017-09-03 11:42:59

标签: c++ syntax initialization most-vexing-parse variable-initialization

我使用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 个答案:

答案 0 :(得分:3)

这是一个解析问题。让我们分开吧:

CompareReachDist(&reach_dists)

您可能认为这会创建一个临时CompareReachDist,其地址为静态reach_dists。但在整体声明的背景下,它被解释为对CompareReachDist的引用。奇怪,但这是因为,粗略地说,C ++的语法有利于函数声明对象声明。以下

pq seeds(CompareReachDist(&reach_dists));

是函数的整体声明。它接受CompareReachDist&并返回pq

您收到的错误是因为很明显,某个功能没有您可以致电的empty会员。

自C ++ 11以来的解决方案是支持列表初始化,这打破了模糊性及其作为函数声明的解析。所以你可以这样做:

pq seeds{CompareReachDist{&reach_dists}};

获得一个对象,正如人们所期望的那样。