2012-12-11 16 views
10

Si consideri il seguente codice:Perché GCC consente di ereditare da una classe nidificata privata?

class A { 
    class B {}; 
}; 

template <typename C> 
class D : A::B {}; 

void f() { 
    D<int> d; 
} 

D<int> eredita da A::B che è una classe privata nidificato. Mi aspettavo che questo fosse un errore, ma GCC accetta questo codice. È un bug in GCC o mi sto perdendo qualcosa?

+4

Sembra un bug, dal momento che la rimozione della dichiarazione del modello comporta l'errore previsto. – StoryTeller

+1

MSVC genera un errore. –

+0

Visual Studio 2012 non desidera compilare quel codice. – Yester

risposta

7

Ho trovato la risposta. Dal momento che potrebbe essere utile per altri, lo sto postando qui - questo è il bug GCC 47346.

+2

+1: stavo proprio per postarlo. –

+0

@JesseGood: Ci scusiamo per questo, di solito non rispondo alla mia domanda, ma poiché c'era poca attività e ho trovato la risposta. ;-) – vitaut

+0

Non è stata una lamentela, hai postato prima, quindi ti meriti i voti positivi. Inoltre, rispondere alla tua domanda è una pratica accettata. –

2

Hai provato a creare una classe derivering non modello?

La classe del modello non viene compilata se non esiste un oggetto di quella classe. Tenta di creare un'istanza di questa classe o di creare non-template classe derivata - gcc probabilmente fallirà ;-)

Modifica Il mio male - l'oggetto viene creato e non è responsabile di eventuali errori gcc. Perdonami per quello.

+2

Crea un'istanza. In 'f()' ... – StoryTeller

+0

Ok, giusto. Controllo, funziona: | Non lo capisco, davvero :) – Yester

Problemi correlati