2013-06-16 29 views
5

Parametreler bilinirken bir iç şablon konusunda uzmanlık yapmakta sıkıntı çekiyorum. İşte bir örnek:Varsayılan parametrelerle iç şablonu özelleştirme

template < typename T0 > 
struct outer 
{ 
    template < typename T1 = void, typename T2 = void > 
    struct inner 
    { 
     typedef T1 type; 
    }; 
}; 
template < typename T0 > 
template < typename T1 > 
struct outer<T0>::inner<double,T1> { typedef int type; }; 

Bu iyi çalışıyor. Bunun yerine şöyle iç şablon belirtirseniz, öyle değil: Bunun için

template < typename T0 > 
template < > 
struct outer<T0>::inner<double,void> { typedef int type; }; 

Sınıf şablonları açıkça uzman olmayan çevreleyen ... '>' belirteci önce hata mesajı, "geçersiz açık uzmanlaşma olsun .. .template parametreleri kısmi uzmanlık kullanılmayan: ... T0 ". WTAF'ın burada olduğundan emin değil. başarısız olmasına

template < typename T0 > 
struct outer<T0>::inner<double,void> { typedef int type; }; 

Ben bu beklenen ve hata iletisi şaşırtıcı değildir:

Ben de bu çalıştı. Şöyle: "çok az şablon parametre listesi".

Peki, bunu yapmanın doğru yolu nedir? Elbette etrafta hack yapabilirim ama eğer tercih etmem gerekirse.

+0

ilgili: http://stackoverflow.com/questions/9219157/why-cant-i-specialize-the-nested-template -member-uzmanlaşmadan-kapalı? lq = 1 –

+0

Hmm ... Bir arama yaptım ama bu gelmedi. Bunu yapmadan önce doğru keçi türlerini kurban etmemeliydim. –

cevap

7

Buna izin verilmiyor. Kendisi tamamen uzmanlaşmış olmayan bir sınıf şablonunun bir üyesini tamamen uzmanlaştıramazsınız. Paragraf Başına

C++ 11 Standardının 14.7.16:

sınıf şablonunun bir üyesi veya ad alanı kapsamına görünen üye şablonuna, üye şablonu için açık bir uzmanlık bildiride

ve Kapsayıcı sınıf şablonlarının bazıları, sınıf şablonlarının numaralı dokümanlarda açık bir şekilde özelleştirilmiş olmaması durumunda, bildirimin bir sınıf üyesi şablonunu açık bir şekilde uzmanlaştırmaması dışında özel olmayan, olarak kalabilir. [...]

Ayrıca C++ 11 Standardının paragraf 14.7.3/15 der ki:

üyesi veya üye şablon birçok kapsayan sınıf şablonları içinde yuvalanmış olabilir. Böyle bir üye için açık bir uzmanlığında, açıkça bildirilen her bir sınıflandırma sınıfı şablonu için üye bildirimi bir template<> tarafından yapılmalıdır. [Örnek:

template<class T1> class A { 
    template<class T2> class B { 
     void mf(); 
    }; 
}; 
template<> template<> class A<int>::B<double>; 
template<> template<> void A<char>::B<char>::mf(); 

- uç örneği]

+0

Bu üye bir işlev değil, aynı kuralın iç içe türler için geçerli olduğunu varsayalım? –

+0

Nate'in doğru olduğunu varsayarsak. Bölüm/ayet söyleyebilir misiniz? 03 daha iyidir, ama 11 yapardı. –

+1

@CrazyEddie: Evet, bir alıntı arıyorum –

İlgili konular