2012-08-17 11 views
10

Ho un caso strano con Visual Studio 2003. Per motivi legittimi in qualche modo, ho la seguente gerarchia:sbagliato la risoluzione dei nomi quando genitori e classe interna hanno lo stesso nome

class A {}; 

class B : public A { 
public: 
    class A {}; 
}; 

class C : public B::A {}; 

Cioè, ho un interno classe con lo stesso nome di un genitore della classe esterna. Quando C prova ad ereditare da B::A, Visual Studio pensa che sto indicando la classe genitore A, non la classe nidificata entro B. GCC sembra risolvere la versione della classe interna come mi aspettavo

Si tratta di un bug di Visual Studio 2003 o sto sbagliando? C'è una soluzione alternativa (oltre all'aggiornamento di Visual Studio)?

+0

Visual C++ 2003 è stato rilasciato nove anni fa. Sarebbe consigliabile aggiornare per molti motivi. –

+1

@JamesMcNellis Se io fossi responsabile di queste cose avremmo aggiornato molto tempo fa, ma purtroppo non sono –

risposta

2

Sì, questo sembra un bug VS2003. La soluzione è semplice: utilizzare typedef, funziona in questo modo:

class A { public: int x; }; 
class B : public A { public: class A { public: int y; }; }; 

typedef B::A BA; 

class C: public BA {}; 

void f() 
{ 
    C cc; 
    cc.y = 0; 
} 
5

Sembra un errore in Visual C++ 2003. L'utilizzo di Visual C++ 2012, B::A nomina correttamente la classe nidificata A, non la classe base A.

+0

Per quanto riguarda una soluzione, non lo so: il design è piuttosto discutibile. Vorrei rinominare la classe annidata. Se avessi installato Visual C++ 2003, proverei a vedere cosa succede, ma non ho usato Visual C++ 2003 in pochi anni. –

+0

Ero stupido e non ho testato il mio esempio semplificato; risulta che era sbagliato. Quello aggiornato riproduce il problema –

+2

@MichaelMrozek VS 2012 risolve la classe interna. – ForEveR

0

Sembra un bug VS,
Non sapevo Grazie per la pubblicazione.
Penso che la soluzione alternativa sarà un modello SafeInherit Non so quale sarà il nome migliore.

template <typename T> 
struct SafeInherit{ 
    typedef T Type; 
}; 

class B : public SafeInherit<A>::Type { 
    public: 
    class A {}; 
} 
Problemi correlati