2013-06-16 12 views
5

Ho problemi a specializzare un modello interno quando tutti i parametri sono noti. Ecco un esempio:Specializzazione del modello interno con i parametri predefiniti

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

Questo funziona bene. Se io invece di specificare il modello interno in questo modo, non è così:

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

Per questo il messaggio di errore, "non valido specializzazione esplicita prima di '>' token ... racchiudono i modelli di classe non sono esplicitamente specializzate .. .template parametri non usati nella specializzazione parziale: ... T0 ". Non sono sicuro che il WTAF stia succedendo qui.

Ho anche provato questo:

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

Mi aspettavo questo a fallire e il messaggio di errore non è sorprendente. Era: "troppo pochi elenchi di parametri template".

Quindi, qual è il modo corretto per farlo? Ovviamente posso aggirarlo, ma se non dovessi preferirei non farlo.

+0

correlati: http://stackoverflow.com/questions/9219157/why-cant-i-specialize-the-nested-template -member-without-specializing-enclosing? lq = 1 –

+0

Hmm ... Ho fatto una ricerca ma non si è presentata. Non deve aver sacrificato la specie corretta di capra prima di farlo. –

risposta

7

Non consentito. Non è possibile specializzare completamente un membro di un modello di classe che non è stato completamente specializzato.

al comma 14.7.16 del C++ 11 standard:

In una dichiarazione specializzazione esplicita per un membro di un modello di classe o un modello utente che appare portata namespace, il modello socio e alcuni dei modelli di classe che li contengono possono rimanere non specializzati, eccetto che la dichiarazione non deve specializzare esplicitamente un modello di membro di classe se i suoi modelli di classe non sono esplicitamente specializzati come. [...]

Inoltre, il paragrafo 14.7.3/15 del C++ 11 standard dice:

Un membro o un modello di membro possono essere annidati all'interno di molti modelli di classe che racchiude. In una esplicita specializzazione per un membro del genere, la dichiarazione del membro deve essere preceduta da un template<> per ogni modello di classe che incorpora esplicitamente specializzato. [Esempio:

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

- esempio fine]

+0

Non è una funzione membro, ma suppongo che la stessa regola si applichi ai tipi annidati? –

+0

Supponendo che Nate sia corretto. Puoi citare capitolo/verso? 03 è meglio, ma 11 farebbe. –

+1

@CrazyEddie: Sì, sto cercando un preventivo –

Problemi correlati