簡體   English   中英

具有自定義比較功能的C ++優先級隊列

[英]C++ priority queue with custom compare function in a class

我正在嘗試使用自定義比較函數創建優先級隊列,作為類的數據成員。 如果我把隊列放在一個類中,代碼就無法編譯,但如果它在main函數中,它可以正常工作:

#include <queue>
#include <vector>
using namespace std;

bool cmp(int x, int y) { return (x > y); }

class A {
public:
private:
    priority_queue<int, vector<int>, decltype(cmp) > pq(cmp); // Error at pq(cmp) : function "cmp" is not a type name
};


int main() {

    priority_queue<int, vector<int>, decltype(cmp) > pq(cmp); // no error here
    return 0;
}

我正在使用Microsoft VS2015獲取上述代碼。 cmp函數放在類中是沒有區別的。 你能解釋為什么會發生這種情況並為此提供可能的解決方案

編輯1:

這條線在main

priority_queue<int, vector<int>, decltype(cmp) > pq(cmp); // no error here

確實產生錯誤,但我的IDE無法檢測到它。 使用decltype(&cmp)將消除此錯誤。

首先,我在考慮編譯器中的錯誤,但我可以重現它。 然后它突然變得明顯:

foo bar(baz);

仔細觀察,這與您的代碼中的模式相同。 由於最令人煩惱的解析,這是一個函數聲明

因此,您嘗試在此處聲明一個名為pq的函數,返回一個優先級隊列並使用一個類型為cmp參數。 但是,編譯器無法找到該類型。

更改為使用支撐初始化應解決此問題:

#include <queue>
#include <vector>
using namespace std;

bool cmp(int x, int y) { return (x > y); }

class A {
public:
private:
    priority_queue<int, vector<int>, decltype(&cmp) > pq{cmp};
};


int main() {
   // priority_queue<int, vector<int>, decltype(cmp) > pq(cmp); // this is wrong, too
    return 0;
}

(Ideone)

但請不要問我為什么它在函數內部工作。 它也不在函數內部工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM