при компиляции некоторого кода, который я столкнулся с ошибкой компилятора, которая казалась мне странной, и связана с наследованием, вложенными классами, с использованием объявлений и модификаторов доступа.Вложенный класс с использованием объявлений и модификаторов доступа
В принципе, намерение состоит в том, чтобы производный тип отображал вложенный защищенный класс базового типа.
следующий короткий пример, чтобы продемонстрировать вопрос:
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?
Я думаю, получаю ошибку во время компиляции лучше, чем работает и проблем последних. –
Поскольку его защищенный, по стандартной основной функции не сможет получить к нему доступ –
@AliKazmi Что защищено? 'Derived' изменяет модификатор доступа для' Nested'; он не защищен в этом случае. Кроме того, 'value_enum' не защищен внутри' Nested'. – namezero