2015-04-09 12 views
5

Próbuję specjalizować klasę szablonów wewnątrz innej klasy, ale kompilator mi nie pozwala. Kod działa poza klasą Foo, ale nie w środku i chcę, aby struct Bla był prywatny dla klasy Foo.Jak specjalizować szablon podklas?

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

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

Odpowiedz

3

Nie można specjalizować się wewnątrz klasy, przeznaczenie:

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

Dzięki, to jest właśnie rozwiązanie. –

+0

@GoswinvonBrederlow zauważ, że użyłem tutaj 'public', więc mogę wyświetlić' Bla :: x'. Jednak domyślam się, że używasz 'przyjaciela' lub wyświetla się poprzez funkcję członka, w takim przypadku powinieneś być w porządku. – vsoftco

+0

To sprawia, że ​​myślę. Czy to nie pozwala pogwałcić prywatności klasy? 'class Foo {static constexpr int y = 1; public: template struct Bla; }; szablon <> struct Foo :: Bla <> {static constexpr int x = y; }; 'Foo :: y jest prywatny, ale poprzez wyspecjalizowanie Bla'a każdy użytkownik Foo może uzyskać do niego dostęp poprzez Bla :: x. –

4

Po prostu nie możesz tego zrobić. Błąd sumuje to ładnie. Szablony klas mogą być wyspecjalizowane wyłącznie w zakresie przestrzeni nazw. class Foo nie jest przestrzenią nazw.

Można zrobić to na zewnątrz klasy, jak na tym przykładzie od normy [temp.class.spec]:

Klasa szablon częściowa specjalizacja może być uznana lub redeclared w dowolnym zakresie przestrzeni nazw, w której można zdefiniować jego definicję (14.5.1 i 14.5.2). [Przykład:

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 

końcem przykład]

+0

upvoted dla standardowych cytaty, jesteś bardzo szybko :) – vsoftco

+0

@vsoftco Po prostu zacznij od rozdziału Szablony i szukaj "zakresu" :) – Barry

+1

tak, wiem jak to działa, ale wciąż byłem zbyt leniwy :) – vsoftco

Powiązane problemy