2011-02-02 14 views

cevap

12

Bu bir uzmanlık alanıdır. template<>, uzmanlaşmanın kendisinin templasyonda olmadığı anlamına gelir, yani kısmi bir uzmanlık değil, açık bir uzmanlıktır.

+0

"şablon <> uzmanlaşma kendisi şablonlu olmadığı anlamına gelir". Bu, yalnızca söz konusu örnek için geçerli olduğu için tamamen doğru değildir. Örneğin: Şablon struct A {template void f(); }; <> template void A :: f() {} '. Bu diğer örnekte, üyenin açık uzmanlığı hala bir şablon. (Bu biraz nitpicking, ama bilmek önemlidir). –

+0

Cevabı anlamıyorum. Kısmi ve özel arasında nasıl farklılaştığını göstermek için değişiklik yapabilir misiniz? – wallyk

4

Sadece gerekli sözdizimi olduğunu söyleyebilirsiniz.

Normal sözdizimi template< typename T > struct Allowed;

biz bu durumda T std :: string kendi başına struct Allowed<std::string> yazma sen ima olmaz çünkü hala gerekli olduğuna açılı parantez ancak kelime şablonu ve açılı parantez içine koymak için hiçbir şey olduğunu biliyoruz Çünkü şablonu özelleştirme, ancak yalnızca std :: string ile birini örnek olarak oluşturuyorsunuz. ("Struct" kelimesinin bunu yapmak gerekli değildir, ancak yine de izin verilir).

10

Bu bir şablon uzmanlığıdır. Tipik durum kısmi uzmanlaşma olacaktır: Gördüğünüz gibi, uzmanlık şablon parametrelerinden bir elementi kaldırır ve açıkça yerine kaldırılan birinin bir tür devletler

#include <iostream> 

template<class T1, class T2> struct foo 
{ 
    void doStuff() { std::cout << "generic foo "; } 
}; 

template<class T1> 
struct foo<T1, int> 
{ 
void doStuff() { std::cout << "specific foo with T2=int"; } 
}; 

. Sadece bir şablon türü varsa Yani, <> sadece boş hale gelir:

template<class T1> struct bar 
{ 
    void doStuff() { std::cout << "generic bar"; } 
}; 

template<> 
struct bar<int> 
{ 
void doStuff() { std::cout << "specific bar with T1=int"; } 
};