2015-06-24 22 views
7

Verilen bu tanımlarÖzel üye türündeki bir şablonu ne zaman uzmanlaştırabilirsiniz?

template<class T> class foo {}; 
template<class T> class foo1 { static int i; }; 
class bar { class baz {}; }; 
Bu

template<> 
class foo<bar::baz> {}; 

derler görmek şaşırttı

ama bu 'class bar::baz' is private

template<> 
int foo1<bar::baz>::i = 42; 

bu oluyor hatası ile başarısız ve orada türünü genel yapmaktan başka bir çözüm var mı?

+0

ilginç olan *. Bu sınıfın bir değişkenini tanımlayan bir hata olduğunu anlıyorum. I.e., foo {}; 'Tamam (g ++), ancak sonra' foo f; 'değil. Yani, hemen hemen kullanılamaz bir tiptir ve hata nispeten geç olarak gelir (yani, sınıf tanımında değil). Hep [kamu tip takma] ekleyebilir gibi, kullanışsız değil –

+0

@AmiTavory (http://coliru.stacked-crooked.com/a/22807544d8414c4e). Yine de ilginç bir soru. Neden uzmanlık üzerine bir erişim kontrolü var? :: i? –

+0

@DanielFrey Anladığım kadarıyla bu soru, 'bar' kodunu değiştirmeden durumla ilgili. –

cevap

5

CWG #182 düşünün:

Bazı erişim kontrolleri açık örneklemesi üzerine bastırılır. 14.7.2 [temp.explicit] paragraf 8 diyor [...] Ben benzer ifade açık uzmanlık için (bulabildiğim o) yok şaşırdım. İki olgu (uzmanlık izin gerektiği, diğer bir deyişle) aşağıdaki örnekte eşit ele alınmalıdır inanıyoruz.

template <class T> struct C { 
    void f(); 
    void g(); 
}; 

template <class T> void C<T>::f(){} 
template <class T> void C<T>::g(){} 

class A { 
    class B {}; 
    void f(); 
}; 

template void C<A::B>::f(); // okay 
template <> void C<A::B>::g(); // error - A::B inaccessible 

[...]

Gerekçe (2002 Ekim):

Biz bu yeniden ve iki olguda (açık uzmanlaşma ve açık örnekleme) arasındaki fark uygun olduğuna karar

. Açık bir örnekleme gibi bir şey adlandırma izin gerektiğinde erişim kuralları bazen bükülmüş, ama açık uzmanlık oluşumu isimlendirme değil, aynı zamanda bir yerde bir tanım sağlayarak sadece gerektirir.

: tutarsız davranışı sınıf şablonunun karşılık gelen açık uzmanlaşma gelince, onlar bir hata iletisi sorunu yok - görünüşte -

GCC ve Clang gerçekten de gösterilen örnekte son satırı, reddederim

template <class> struct T { 
    void g(); 
}; 

class A { class B; class C; }; 

template <> struct T<A::B>; // Ok 
template <> void T<A::C>::g(); // Error 

Demo. Nerede noktasında bir şablon argüman ismi erişilebilir olacaktır

: Ben burada bir yargıda bulunmak ve §14.3/3 tarafından size kötü şekillendirilmiş gösterdi hem vakaları arayacağım şablon argümanı olarak kullanılmıştır. *

İlgili konular