2016-04-07 9 views
0

Öncelikli sıran nesnesi örneklemesini anlamak için aşağıdaki kodu kullanıyorum.Priorty_queue örneğinde karşılaştırıcı için şablon parametresi neden sorulmuyor?

#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 şablonunun üçüncü parametresi karşılaştırıcı işlevdir. Görüldüğü gibi 'std :: büyük' ​​kullandım. Ben şablon örnekleme (benim uyarınca) std :: doğru şekilde yani daha hiç Paramtre vermediği bu derleme başarısız bekliyordum rağmen

Bu

başarıyla

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

edilir derleme Giriş parametresi olmadan std :: büyük tanımını bulabilirim.

Anlayışta neleri kaçırdığımı gösterebilir misiniz?

+1

şablon 'std :: büyük' ​​parametresinin 'void' olan bir varsayılan argümanı vardır. –

+3

"* Giriş parametresi olmadan std :: büyüklüğünün herhangi bir tanımını bulamamış olabilirim. *" Bir tane mi arıyorsunuz? "(Http://en.cppreference.com/w/cpp/utility/functional/greater –

+0

@NicolBolas [www.cplusplus.com/](http://www.cplusplus.com/reference/functional/greater/] adresinde kontrol ettim ve bu karışıklık kaynağıydı. Hemen her zaman referans için cplusplus.com'a gidiyorum. Şimdi de cppreference.com kontrol etmek için sebep var. Teşekkürler. – UnSat

cevap

3

std::greatervoid olduğunu c++14 beri varsayılan bir şablon parametresi vardır:

template< class T = void > 
struct greater; 

Ama bu yalnızca bir varsayılan şablon parametresi ise ikisi int ile arama olamazdı, çünkü başarısız olur. standart kütüphanesi std::greater bir ihtisas sağlar

T değilken: Ne oldu (encppreference.com itibaren) "anlaşılmasını parametre türleri ve dönüş türü bırakır" hangi boşluğa için std::greater bir specialization olmasıdır Belirtilen, parametre türlerini ve geri dönüş türünü çıkarır.

greater<void> işlevi nesnesi x> y deducing bağımsız değişken uygulanması ve geri türleri (sınıf şablon uzmanlık) c++14 olmadan bu iki derlemek için başarısız


Not:

// 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

Bir yan notta, bu 1998 yılında yapılmalıydı. – SergeyA

İlgili konular