2015-10-13 11 views
12

Klasa:Zagnieżdżone klasy szablonu specjalizacji

template<typename C, typename T> 
class A 
{ 
    template <typename U> 
    class Nested{}; 

    Nested<T> n; 
}; 

I chcę się specjalizować Nested. Oto, co starałem:

template<typename C, typename T> 
class A 
{ 
    template <typename U> 
    class Nested{}; 

    template <> 
    class Nested<int>{}; // by my logic this should work by I have a compilation error "explicit specialization in non-namespace scope 'class A<C, T>'" 

    Nested<T> n; 
}; 

moja następna próba:

template<typename C, typename T> 
class A 
{ 
    template <typename U> 
    class Nested{}; 

    Nested<T> n; 
}; 

template<> 
A<>::Nested<int>{}; // What is the correct syntax to do it here? Now I have an error "wrong number of template arguments (0, should be 2)" 

tutaj na stackoverflow znalazłem rozwiązanie:

template<typename C, typename T> 
class A 
{ 
    template <typename U, bool Dummy = true> 
    class Nested{}; // why need of this Dummy?? 

    template <bool Dummy> 
    class Nested<int, Dummy>{}; // why need to provide an argument?? 

    Nested<T> n; 
}; 

To doskonale działa, ale nie mogę zrozumieć, jak to zrobić. Dlaczego podać fałszywy argument szablonu? Dlaczego nie mogę używać surowej specjalizacji template<> class Nested<int, true>{} lub template<> class Nested<int>{}?

Odpowiedz

12

Zabronione jest stworzenie wyraźnej specjalizacji w zakresie klasowej:

Wyraźna specjalizacja zgłasza się w otaczającej przestrzeni nazw wyspecjalizowane szablonu.

Ale nie wolno tworzyć częściową specjalizację:

Klasa szablon częściowa specjalizacja może być uznana lub redeclared w dowolnym zakresie przestrzeni nazw, w której jego definicja może być zdefiniowana (14.5.1 i 14,5 .2).

tym

template <bool Dummy> 
class Nested<int, Dummy>{}; // why need to provide an argument?? 

jest częściowa specjalizacja i to pozwoliło na stworzenie takiej specjalizacji w zakresie klasowej. Nie można również w pełni wyspecjalizować klasy zagnieżdżonej w nie specjalizowanej klasie zewnętrznej. Można to zrobić:

template<> 
template<> 
class A<int, double>::Nested<int> 
{ 
}; 

ale nie można zrobić

template<typename C, typename T> 
template<> 
class A<C, T>::Nested<int> 
{ 
}; 
1

udało mi się uzyskać to do pracy, poprzez zdefiniowanie całą zawartość wyspecjalizowanej klasy szablonu w zewnętrznej klasie. Tak więc wszystkie funkcje są całkowicie zdefiniowane zgodnie z definicją klasy. Brak definicji funkcji zewnętrznych, ponieważ nie wydaje się, aby to się zgadzało. To znaczy.

template <typename T, size_t N> 
class A 
{ 
private: 
    template <size_t M> 
    class B 
    { 
     ... 
    }; 

    template <> 
    class B<2> 
    { 
     ... 
    }; 
    ... etc 
}; 

Pracował na MS2015 co najmniej. Kod działa dobrze.

+1

Tak, ale nie działa na gcc i clang. Loos jak Microsoft nie przestrzega standardu. A może jest przełącznik kompilatora. – nikitablack

Powiązane problemy