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?
Penso che ottenere un errore in fase di compilazione è meglio di esecuzione in problemi di queste ultime. –
Poiché è protetto, dalla funzione principale standard non sarà in grado di accedervi –
@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