Прочитать на английском

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


Ошибка компилятора 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;
   }
};