2015-04-09 19 views
5

Şablon sınıfını başka bir sınıfta uzmanlaştırmaya çalışıyorum ama derleyici izin vermiyor. Kod, Foo sınıfı dışında çalışır ama içeride değil ve Bla'nun Foo sınıfına özel olmasını istiyorum.Şablon alt sınıfı nasıl uzmanlaşır?

class Foo { 
    template<typename ... Ts> struct Bla; 
    template<> struct Bla<> { static constexpr int x = 1; }; 
}; 

error: explicit specialization in non-namespace scope 'class Foo' 

cevap

3

:

class Foo { 
public: // so we can test it easily 
    template<typename ... Ts> struct Bla; 
}; 

// specialize it outside the class 
template<> class Foo::Bla<> { static constexpr int x = 1; }; 

int main() 
{ 
    std::cout << Foo::Bla<>::x; 
} 
+0

Teşekkürler, bu tam olarak çözüm. –

+0

@GoswinvonBrederlow burada 'public' kullanıldığını not ederek,' Bla :: x' görüntüleyebilirim. Ancak, bir "arkadaş" kullandığınızı veya üye bir işlevle görüntülediğinizi tahmin ediyorum, bu durumda tamam olmalısınız. – vsoftco

+0

Bu beni düşünmemi sağlıyor. Bir sınıfın gizliliğini ihlal etmesine izin vermez mi? foo sınıfı {static constexpr int y = 1; public: template struct Bla; }; şablon <> struct Foo :: Bla <> {statik konsoleks int x = y; Foo :: y özeldir, ancak Bla'in uzmanı tarafından, Foo'nun herhangi bir kullanıcısı, Bla :: x aracılığıyla ona erişebilir. –

4

Bunu yapamazsınız. Hata güzelce özetliyor. Sınıf şablonları sadece isim alanı kapsamında uzmanlaşabilir. class Foo bir ad alanı değil.

Burada standart [temp.class.spec] Bu örneğe göre olduğu gibi, dış sınıfa yapabilir

: A sınıfı şablonu kısmi uzmanlık ilan veya herhangi bir ad kapsamına redeclared edilebilir

hangi tanım tanımlanabilir (14.5.1 ve 14.5.2). [Örnek:

template<class T> struct A { 
    struct C { 
     template<class T2> struct B { }; 
    }; 
}; 

// partial specialization of A<T>::C::B<T2> 
template<class T> template<class T2> 
    struct A<T>::C::B<T2*> { }; 

A<short>::C::B<int*> absip; // uses partial specialization 

-end örnek] Bunu sınıfı, kullanım içeride uzman olamaz

+0

standart tırnak için upvoted, gerçekten hızlı :) – vsoftco

+0

@vsoftco Sadece Şablonlar bölümünden başlayıp "kapsam" için arama yapmaya devam edin :) – Barry

+1

Evet, nasıl çalıştığını biliyorum ama yine de çok tembel davrandım :) – vsoftco

İlgili konular