2013-03-23 11 views
9

Qual è l'effetto reale del seguente costrutto:Effetti di una classe base const

class Base { /* ... */ }; 

template<class T> 
class Derived : public T { /* ... */ }; 

int main() { 
    Derived<const Base> d; 
    // ... 
} 

Dispone la classe Derived hanno solo l'accesso alla const -parte dell'interfaccia di Base? I miei primi test indicano che in realtà non c'è alcun effetto. Perché?

Grazie!

+0

credo, che la risposta è qui: http://stackoverflow.com/a/13435319/945183 –

+0

Credo che queste domande si riferiscono a cose diverse: quelli legati sono circa template * * dichiarazioni del modulo 'modello struct test;' e la mia domanda riguarda template * istanze * i cui parametri applicati sono 'const' types. – phlipsy

risposta

2

La mia ipotesi è che il const viene ignorato, perché se si tenta di scrivere

class Derived : public const Base 

il programma doesn't compile.

EDIT:

frozenkoi ha dato la parte rilevante dello standard nei commenti:

"A nome-typedef (7.1.3) che i nomi di un tipo di classe, o un CV- la sua versione qualificata è anche un nome di classe.Se viene utilizzato un nome typedef che identifica un tipo di classe qualificata cv dove è richiesto un nome-classe, i qualificatori cv vengono ignorati. l'identificatore in una classe-testa. " §9.1

+0

Hai ragione, non puoi scriverlo esplicitamente. Immagino sia come 'void func() {return void(); } '- Scriverlo in modo esplicito è completamente inutile ma nel contesto di modelli importanti come caso d'angolo. – phlipsy

+0

Penso che abbia più a che fare con 'const' che viene ignorato quando si dichiara il tipo di quello che viene ignorato nella dichiarazione della classe. (no C++ standard a portata di mano), ma è su questa linea: "I qualificatori di cv di primo livello sul parametro template vengono ignorati quando si determina il tipo" §14 – frozenkoi

+1

Non sono convinto perché questo è solo un problema di sintassi; questo compila: http://ideone.com/ik41t3 –

Problemi correlati