Поделиться через


Ошибка компилятора C2247

"идентификатор" недоступен, так как класс использует "описатель" для наследования от класса

identifier наследуется от класса, объявленного частным или защищенным доступом.

Следующий пример приводит к возникновению ошибки C2247:

// C2247.cpp
class A {
public:
   int i;
};
class B : private A {};    // B inherits a private A
class C : public B {} c;   // so even though C's B is public
int j = c.i;               // C2247, i not accessible

Эта ошибка также может быть создана в результате работы соответствия компилятора, которая была выполнена для Visual Studio .NET 2003: управление доступом с защищенными элементами. Защищенный член (n) можно получить только через функцию-член класса (B), наследуемого от класса (A), из которого он (n) является членом.

Для кода, допустимого как в visual Studio .NET 2003, так и в версиях Visual Studio .NET Visual C++, объявите участника другом типа. Также можно использовать общедоступное наследование.

// C2247b.cpp
// compile with: /c
// C2247 expected
class A {
public:
   void f();
   int n;
};

class B: protected A {
   // Uncomment the following line to resolve.
   // friend void A::f();
};

void A::f() {
   B b;
   b.n;
}

C2247 также можно создать в результате работы соответствия компилятора, которая была выполнена для Visual Studio .NET 2003: частные базовые классы теперь недоступны. Класс (A), который является частным базовым классом для типа (B), не должен быть доступен для типа (C), который использует B в качестве базового класса.

Для кода, допустимого как в visual Studio .NET 2003, так и в версиях Visual Studio .NET Visual C++, используйте оператор области.

// C2247c.cpp
// compile with: /c
struct A {};

struct B: private A {};

struct C : B {
   void f() {
      A *p1 = (A*) this;   // C2247
      // try the following line instead
      // ::A *p2 = (::A*) this;
   }
};