6

durante la compilazione del codice che ho trovato in un errore del compilatore che mi sembrava strano e riguarda l'ereditarietà, le classi nidificate, l'uso di dichiarazioni e i modificatori di accesso.Classe nidificata che utilizza dichiarazioni e modificatori di accesso

In sostanza, l'intenzione è che un tipo derivato esponga una classe protetta nidificata di un tipo di base.

La seguente breve esempio per dimostrare il problema:

class Base 
{ 
protected: 

    struct Nested 
    { 
     enum value_enum 
     { 
      val = 0, 
      val2, 
      val3 
     }; 
    }; 

}; 

class Derived : public Base 
{ 
public: 

    using Base::Nested; 
}; 


int main(int argc, char** argv) 
{ 
    //Base::Nested aa; // error, as (I) expected 
    //Base::Nested::value_enum ab; // error, as (I) expected 

    Derived::Nested ba; // works, as (I) expected 
    Derived::Nested::value_enum bb; // MSVC error, as (I) did not expect 


    return 0; 
} 

Vedere live.

MSVC11 (v11.00.61030) soffoca su questo codice con il seguente errore:

error C2248: 'Base::Nested' : cannot access protected struct declared in class 'Base'

Sia GCC e Clang compilare questo correttamente, quindi senza la possibilità di citare le parti rilevanti dalla norma, direi questo è un bug MSVC.

C'è un modo per aggirare questo con MSVC?

+0

Penso che ottenere un errore in fase di compilazione è meglio di esecuzione in problemi di queste ultime. –

+1

Poiché è protetto, dalla funzione principale standard non sarà in grado di accedervi –

+3

@AliKazmi Che cosa è protetto? 'Derivato' cambia il modificatore di accesso per' Nested'; non è protetto in questo caso. Inoltre, 'value_enum' non è protetto all'interno di' Nested'. – namezero

risposta

1

Per MSVC la seguente soluzione funziona:

class Derived : public Base 
{ 
    public: 

    using Base::Nested; 
    typedef Base::Nested::value_enum value_enum; // add this 
}; 

int main(int argc, char** argv) 
{ 
    //Base::Nested aa; // error, as (I) expected 
    //Base::Nested::value_enum ab; // error, as (I) expected 

    Derived::Nested ba; // works, as (I) expected 
    Derived::value_enum bb = Derived::value_enum::val; // now works in MSVC 


    return 0; 
}