2010-02-03 24 views
9

Ben şablonları aşağıdaki seti var:Şablonlar uzmanlık

//1 
template< typename T > void funcT(T arg) 
{ 
    std::cout<<"1: template< typename T > void funcT(T arg)"; 
} 
//2 
template< typename T > void funcT(T * arg) 
{ 
    std::cout<<"2: template< typename T > void funcT(T * arg)"; 
} 
//3 
template<> void funcT<int>(int arg) 
{ 
    std::cout<<"3: template<> void funcT<int>(int arg)"; 
} 
//4 
template<> void funcT< int * >(int * arg) 
{ 
    std::cout<<"4: template<> void funcT< int *>(int * arg)"; 
} 

//... 

int x1 = 10; 
funcT(x1); 
funcT(&x1); 

Birisi lütfen açıklayabilir neden funcT(x1); aramalar fonksiyon 3. ve funcT(&x1); aramalar fonksiyon 2. ancak beklenmemektedir 4. olarak?
http://www.gotw.ca/publications/mill17.htm numaralı bu makaleyi okuduğumda, "aşırı yük özünürlüğü uzmanlıkları yoksayar ve yalnızca temel işlev şablonlarında çalışır" der. Fakat bu mantığa göre funcT(x1);, # 1 numaralı işlevi değil, # 3'ü çağırmalıdır. Kafam karıştı.

+0

Bu konuyla ilgili görünüyor: http://www.gotw.ca/publications/mill17.htm –

+0

Bunun için gerçekten iyi bir kitap gönderebilirim: Addison Wesley - C++ Şablonları - Tam Kılavuz – erick2red

cevap

11

# 3 ve # 4 numaralı fonksiyonlar sırasıyla # 1, # 1 ve # 2 değil.

Bu, derleyicinizin önce # 1 ve # 2 arasında seçim yapacağını gösterir. FuncT (x1) için en uygun olacak şekilde # 1'i seçtiğinde, o zaman uzmanlığı seçer # 3. FuncT için (& x1), # 2'yi en uygun şekilde seçer ve uzmanlık bulamaz.

template<> void funcT<>(int * arg) 

olarak # 4 yazarak

onu 2'nin bir uzmanlık haline gelir ve 4. fonksiyon (& x1) için denir beklenen sonucu elde edersiniz. eğer eşleşirse düzenli fonksiyonları daima seçilmiş yerine versiyonlarını şablon edilecektir beri

bir diğer seçenek,

void funcT(int *arg) 

yazmak olacaktır.

+0

Doğru. # 2'yi # 2 uzmanlığı yapmak ve "beklenen" davranışı elde etmek için bunu ekleyebilirdiniz, "template <> void funcT <> (int * arg)" –

+0

@ Éric Malenfant: true, I 'olarak yazılmalıdır. Yorumunuzun veya düzenlememizin önce mi geldiğinden emin değilsiniz, ancak yine de teşekkürler. – villintehaspam

+0

Neden "template <> void funcT <> (int * arg)" değil, "template <> void funcT (int * arg)')? – sepp2k