2016-06-12 13 views
0

(カスタム)priority_queue参照を渡すことができません。優先度キューはラムダを使用してカスタマイズされました。回避策はありますか?私は、Functorとそのすべてを使ってみましたが、priority_queueコンストラクタがソートメソッドを受け入れないさまざまな問題のコンパイルステップに失敗することなく、priority_queueの作成で過去の行を進めることはできませんでした。私はそれがラムダに到達することはできませんまたはヘッダーのいくつかの特別な型宣言が必要だと思うが、私はそれを把握することはできません参照によるカスタムプライオリティキューの受け渡し

ここに私のコードの単純化バージョンです。ここで

#include <queue> 
#include <memory> 

struct Node 
{ 
    int full_dist, 
     dist1, 
     dist2; 

    Node(int d1, int d2) { full_dist = d1 + d2; } 
}; 

void some_processing(std::priority_queue<std::shared_ptr<Node>>& nodes) 
{ 
    //something being done with the queue 
} 

int main() 
{ 
    auto comp = [] (const std::shared_ptr<Node>& l, const std::shared_ptr<Node> r) -> bool 
    { return l->full_dist > r->full_dist; }; 

    std::priority_queue<std::shared_ptr<Node>, std::vector<std::shared_ptr<Node>>, decltype(comp)> nodes(comp); 
    some_processing(nodes);//breaks here 
} 

は、私は、この例で持っているエラーです:

test.cpp:24:24: error: invalid initialization of reference of type ‘std::priority_queue<std::shared_ptr<Node> >&’ 
from expression of type ‘std::priority_queue<std::shared_ptr<Node>, std::vector<std::shared_ptr<Node>, std::allocator<std::shared_ptr<Node> > >, main()::__lambda0>’ 
some_processing(nodes); 

答えて

1

は比較タイプにテンプレート機能を確認します。

template<typename CompT> 
void some_processing(
    std::priority_queue<std::shared_ptr<Node>, 
         std::vector<std::shared_ptr<Node>>, 
         CompT> & nodes) 
{ 
    // something being done with the queue 
} 

物事を単純にして、容器全体のテンプレートをテンプレートにするだけです。

template<typename QueueT> 
void some_processing(QueueT& nodes) 
{ 
    // something being done with the queue 
} 
+0

ありがとう、それは多くを説明します – Liza

0

あなたのプライオリティキューは、それが型を宣言していますだ

std::priority_queue<std::shared_ptr<Node>, 
      std::vector<std::shared_ptr<Node>>, decltype(comp)> 

です。関数のパラメータは、次の参照先になります。

std::priority_queue<std::shared_ptr<Node>> 

これはまったく異なるタイプです。 1つの型への参照を、完全に異なる型への参照をパラメータとして期待する関数に渡すことはできません。テンプレートクラスの各インスタンスは一意です。ここでの第1クラスと第2クラスの違いは、class Aclass Bの違いと同じ違いです。

+0

私は考えました、私はちょうどこのタイプを記述する方法を知らなかった。他の人はそれをうまく処理する方法を説明しました。あなたの答えをありがとう – Liza

関連する問題