6

при компиляции некоторого кода, который я столкнулся с ошибкой компилятора, которая казалась мне странной, и связана с наследованием, вложенными классами, с использованием объявлений и модификаторов доступа.Вложенный класс с использованием объявлений и модификаторов доступа

В принципе, намерение состоит в том, чтобы производный тип отображал вложенный защищенный класс базового типа.

следующий короткий пример, чтобы продемонстрировать вопрос:

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; 
} 

См live.

MSVC11 (v11.00.61030) дроссели на этом коде со следующей ошибкой:

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

Оба GCC и Clang компилировать это правильно, так что без возможности процитировать соответствующие части от стандарта, я бы сказал, это ошибка MSVC.

Есть ли способ обойти это с помощью MSVC?

+0

Я думаю, получаю ошибку во время компиляции лучше, чем работает и проблем последних. –

+1

Поскольку его защищенный, по стандартной основной функции не сможет получить к нему доступ –

+3

@AliKazmi Что защищено? 'Derived' изменяет модификатор доступа для' Nested'; он не защищен в этом случае. Кроме того, 'value_enum' не защищен внутри' Nested'. – namezero

ответ

1

Для MSVC следующие обходной работы:

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; 
}