2014-12-16 17 views
5

Sto tentando di comprendere più a fondo la sintassi e la semantica dei modelli immaginando costrutti arcani. Credo che la seguente sintassi non è consentita dallo standard C++ 11:Dove nello standard C++ 11 è vietato 'modello <typename T> classe A {...}; modello <typename T> classe A <int> {...}; ' (se dovunque)?

template <typename T> 
class A 
{...}; 

// phony "specialization" 
template <typename T> 
class A<int> 
{...}; 

Tuttavia, non riesco a trovare nello standard C++ 11 in cui non è consentita questa sintassi.

Sono corretto che la sintassi mostrata non è consentita dallo standard C++ 11? In tal caso, dove si può scoprire che la sintassi non è consentita?

+1

Questo è l'errore che si ottiene con clang ++: "errore: la specializzazione parziale di 'A' non utilizza nessuno dei suoi parametri di modello". Quindi suppongo che devi cercare la sezione sulla specializzazione parziale, relativa all'utilizzo dei suoi parametri del modello. PS: g ++ dice semplicemente "errore: parametri modello non deducibili in specializzazione parziale:" – vsoftco

+0

@vsoftco Supponiamo di avere 'template classe A {T t; }; ' –

+0

@Yakk forse la risposta è che è dovuto al fatto che è logicamente impossibile per il costrutto avere un senso che non è consentito, o che il fatto che non sia descritto da nessuna parte come un costrutto * permesso * che lo rende non consentito, piuttosto che è specificamente vietato ovunque. –

risposta

3

Sono abbastanza sorpreso dal fatto che non ci sia un'istruzione esplicita in 14.5.5 [temp.class.spec] dicendo che tutti i parametri del modello di una specializzazione parziale di un modello di classe devono essere utilizzati nella lista-argomenti-template. Ciò renderebbe non valido perché T non viene utilizzato nell'elenco argomento-modello <int>.

Penso che la tua specializzazione fasulla sia solo implicitamente non valida a causa del fatto che non puoi mai eguagliarla, quindi non può mai essere utilizzata. Se si crea un'istanza A<int>, ciò corrisponde al modello principale. Non può corrispondere alla tua specializzazione, perché questo ha un parametro di modello aggiuntivo, T, che non può essere dedotto (suggerisci che potrebbe essere fornito dicendo A<int><double> ma non è una sintassi C++ valida, quindi non aiuta).

Ho chiesto al comitato per gli standard di chiarire perché la tua specializzazione fasulla non è valida (ovviamente lo è, ma non riesco a vedere dove lo dice).

Problemi correlati