2013-06-16 33 views
5

Mam problem ze specjalizowaniem szablonu wewnętrznego, gdy wszystkie jego parametry są znane. Oto przykład:Specjalizujący szablon wewnętrzny z domyślnymi parametrami

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; }; 

Działa to dobrze. Gdybym zamiast określić wewnętrzną szablonu jak tak, to nie:

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

Do tego pojawia się komunikat o błędzie „Nieprawidłowy wyraźnej specjalizacji przed«>»tokena ... załączając szablony klasy nie są wyraźnie wyspecjalizowane .. .template parametry nie używane w częściowej specjalizacji: ... T0 ". Nie wiem, czy WTAF się tutaj dzieje.

Próbowałem też tak:

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

Spodziewałem to się nie powiedzie, a komunikat o błędzie nie jest zaskakujące. Było to "zbyt mała liczba list parametrów".

A więc, jaki jest właściwy sposób na zrobienie tego? Mogę oczywiście się do tego przyzwyczaić, ale jeśli nie będę, wolałbym nie.

+0

powiązane: http://stackoverflow.com/questions/9219157/why-cant-i-specialize-the-nested-template -member-bez-wyspecjalizowanych-obejmujących? lq = 1 –

+0

Hmm ... Poszukałem, ale to się nie ukazało. Przed tym nie musieli poświęcać właściwego gatunku kozy. –

Odpowiedz

7

To nie jest dozwolone. Nie można w pełni wyspecjalizować członka szablonu klasy, który sam nie jest w pełni wyspecjalizowany.

Per pkt 14.7.16 z C++ 11 Standard:

W wyraźnej deklaracji specjalizacji na członka szablonu klasy lub szablonu członkiem wyświetlonym w zakresie przestrzeni nazw, szablon i członkiem niektóre z otaczających go szablonów klas mogą pozostać nieokreślone, niespecjalizowany, , z wyjątkiem tego, że deklaracja nie będzie wyraźnie wyspecjalizowała szablonu należącego do klasy, jeśli jego szablony klasy otaczającej nie są jawnie wyspecjalizowane również. [...]

Również pkt 14.7.3/15 C++ 11 standardowych mówi:

Członek lub szablon element może być zagnieżdżona w wielu szablonów klas zakrywające. W wyraźnej specjalizacji dla takiego elementu, deklaracja elementu powinna być poprzedzona przez template<> dla każdego szablonu klasy otaczającej klasy, który jest wyraźnie wyspecjalizowany. [Przykład:

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(); 

- przykład koniec]

+0

Nie jest to funkcja składowa, ale przypuszczam, że ta sama reguła dotyczy typów zagnieżdżonych? –

+0

Zakładając, że Nate jest poprawny. Czy możesz zacytować rozdział/werset? 03 jest lepsze, ale 11 zrobiłoby. –

+1

@ CrazyEddie: Tak, szukam wyceny –