2016-04-07 7 views
0

私は優先度キューオブジェクトのインスタンス化を理解するために次のコードを持っています。priorty_queueインスタンシエーションのコンパレータのテンプレートパラメータに質問しないのはなぜですか?

#include <queue> 
#include <functional> 

int main(int argc, char *argv[]) 
{ 
    std::priority_queue<int, std::vector<int>, std::greater<>> int_min_heap; 
    return 0; 
} 

priority_queueテンプレートの3番目のパラメータは、コンパレータ関数です。私は 'std :: greater'を使っています。テンプレートのインスタンスの

これは私がSTDにPARAMTERを与えられていないとして、これはコンパイルに失敗することが期待されたが、成功してコンパイルされた::大きい(私ごとなど)正しい方法すなわち

std::priority_queue<int, std::vector<int>, std::greater<int>> int_min_heap; 

です私は入力パラメータなしでstd :: greaterの定義を見つけることができました。

誰も私が理解に欠けていることを指摘できますか?

+1

テンプレート'std :: greater'のパラメータにはデフォルトの引数があります。これは' void'です。 –

+3

"*入力パラメータなしでstd :: greaterの定義を見つけることはできませんでした。*"あなたは[1つを探しましたか?](http://en.cppreference.com/w/cpp/utility/functional/greater ) –

+0

@NicolBolas [www.cplusplus.com/](http://www.cplusplus.com/reference/functional/greater/)で調べたところ、混乱の原因になっていました。私はほとんどの場合、cplusplus.comを参照してください。今私はcppreference.comをチェックする理由がある。ありがとう。 – UnSat

答えて

3

std::greatervoidあるc++14ので、デフォルトのテンプレートパラメータがあります。

template< class T = void > 
struct greater; 

しかし、これは、デフォルトのテンプレートパラメータだった場合は、2 intでそれを呼び出すことができなかったので、それは失敗するでしょう。標準ライブラリはstd::greaterの専門を提供

Tがないとき:何が起こったことはencppreference.comから)「演繹されるパラメータの型と戻り値の型を離れる」と、ボイドのためstd::greaterspecializationがあるということですこれは、推論されるパラメータ型と戻り型を残します。

greater<void> X> Y演繹引数を実装する関数オブジェクトとタイプ (クラステンプレートの特殊化)を返す


c++14ことなく、これらの両方がコンパイルに失敗することに注意してください。

// error: wrong number of template arguments (0, should be 1) 
std::priority_queue<int, std::vector<int> std::greater<>> 

// error: forming reference to void 
std::priority_queue<int, std::vector<int>, std::greater<void>> 
+0

もうひとつ、これは1998年に完了したはずです。 – SergeyA

関連する問題