在优先级队列上调用推送时出现错误 "reference to non-static member function must be called"

Getting error "reference to non-static member function must be called" when calling push on priority queue

这可能是一个明显的问题,但作为 C++ 的新手,我不太确定为什么会出现此错误。

我有以下设置,我使用 priority_queue 类型定义如下:

typedef priority_queue<int,vector<int>,PayloadIndexComparison> PayloadIndexPQ; 

然后,我有一个 class 正在使用这个优先级队列:

struct MappingTechnique {

   vector<double> currentAccumulatedPayloadIndexWeights;
   PayloadIndexPQ payloadIndexPQ(PayloadIndexComparison(&currentAccumulatedPayloadIndexWeights));

   MappingTechnique() {
      for (int i = 0; i < PAYLOAD_SIZE; i++) {
         payloadIndexPQ.push(i); // this line gives an error
      }
   }
}

但是这段代码给出了以下错误:

error: reference to non-static member function must be called
payloadIndexPQ.push(i);

有人知道为什么会这样吗?我在其他地方的代码中使用了相同的优先级队列并且可以毫无问题地调用 push,所以我怀疑这是因为我在构造函数中调用它......

你的

PayloadIndexPQ 
payloadIndexPQ( PayloadIndexComparison(&currentAccumulatedPayloadIndexWeights) );

定义一个函数,而不是一个对象,参见the most vexing parse。使用 { } 代替

PayloadIndexPQ 
payloadIndexPQ{ PayloadIndexComparison(&currentAccumulatedPayloadIndexWeights) };

事实是

PayloadIndexComparison(&currentAccumulatedPayloadIndexWeights)

被认为是 &currentAccumulatedPayloadIndexWeights 的(函数式)转换,因此最终结果是定义一个引用 PayloadIndexComparison 的函数。这就像声明

int f(int(&x)); // declares basically void f(int& x); and not an integer

有关详细信息,请参阅 link。

这一行:

PayloadIndexPQ payloadIndexPQ(PayloadIndexComparison(&currentAccumulatedPayloadIndexWeights));

被解释为函数声明。它是一个名为 playloadIndexPQ 的函数,它引用了一个名为 currentAccumulatedPayloadIndexWeights.

PayloadIndexComparision 对象

我知道,这很奇怪。但是,由于您在 class 定义中,因此您无法使用表达式列表 (...) 声明变量。您可以在默认构造函数的 ctor-initializer 中声明变量并对其进行初始化。

struct MappingTechnique {
    MappingTechnique() : payloadIndexPQ(PayloadIndexComparison(&currentAccumulatedPayloadIndexWeights))
    { }
    // ...
};

在 C++11 中,您有两个额外的选项。您可以使用大括号或等号初始化程序,以便可以在声明数据成员的位置定义数据成员:

PayloadIndexPQ payloadIndexPQ = PayloadIndexComparison(&currentAccumulatedPayloadIndexWeights);
// or PayloadIndexPQ payloadIndexPQ{ ... }