2013-08-08 20 views
14
olarak adlandırılır

Aşağıdaki iki işlev göz önüne alındığında, bir std::pair<const char*, std::size_t> ilettiğimde ilk aşırı yükün çağrılmasını beklerim, çünkü bu, bir genel T'dan daha belirgindir. Ancak Daha belirgin olan aşırı yüklenme,

void foo(const std::pair<const char*, std::size_t>& p) 
{ 
    std::cout << "pair" << std::endl; 
} 

template <class T> 
void foo(const T& v) 
{ 
    std::cout << "generic" << std::endl; 
} 

int main() 
{ 
    const char* s = "abc"; 
    foo(std::make_pair(s, std::size_t(3))); 
} 

bu program çıkışları:

ikinci aşırı yük yerine açıkça pair alır aşırı yükleme denir Neden
generic 

?

Bu bir derleyici sorun mu var? Şu anda oldukça eski bir derleyici (GCC 4.1.2) kullanıyordum.

http://ideone.com/97XwwZ

+0

İşleri buraya

http://ideone.com/97XwwZ

çağrıldığını: http://ideone.com/vV55Ea da VS2010 üzerinde çalışır. – Chad

+0

g ++ (GCC) 4.7.2 – NPE

+0

kullanarak yeniden üretilemez Ne için değer, VS2012 içinde beklediğiniz gibi. –

cevap

9

Sizin derleyici hata kesinlikle. Ne hata, sadece spekülasyon olacaktır, ancak bu kodun daha spesifik çıktı vermesi gerektiği konusunda haklısınız. Örnek, daha ince kuralların herhangi biri için yeterince büyük veya karmaşık değildir.

0

çözünürlüğü aşırı göre, sizin örnekte belirli bir tercih etmeliyiz:

Hmm ... muhtemelen derleyici sorunu IS.

Bunun eski sürüm nedeniyle bir derleyici hatası olduğunu söyleyebilirim. GCC 4.8.1 kullanılarak derlendiğinde. Bu linke göre

pair 

verir: overloading resolution demo

4

Sadece bir derleyici sorunu gibi görünüyor. Eski bir derleyici kullanıyordum (GCC 4.1.2). Daha az antik derleyici kullanarak doğru aşırı sonuçlanıyor gibi görünmektedir

#include <iostream> 
#include <utility> 

void foo(const std::pair<const char*, std::size_t>& p) 
{ 
    std::cout << "pair" << std::endl; 
} 

template <class T> 
void foo(const T& v) 
{ 
    std::cout << "generic" << std::endl; 
} 

int main() 
{ 
    const char* s = "abc"; 
    foo(std::make_pair(s, std::size_t(3))); 
} 
İlgili konular