Compartir vía


Error del compilador C2247

No se puede acceder a "identifier" porque "class" usa "specifier" para heredar de "class"

identifier se hereda de una clase declarada con acceso privado o protegido.

El ejemplo siguiente genera el error 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

Este error también puede generarse como resultado del trabajo de conformidad del compilador efectuado para Visual Studio. NET 2003: control de acceso con miembros protegidos. Un miembro protegido (n) solo puede obtenerse a través de una función miembro de una clase (B) que hereda de la clase (A) de la que (n) es miembro.

Para el código que es válido en las versiones de Visual Studio .NET 2003 y Visual Studio .NET de Visual C++, declare que el miembro es de confianza respecto al tipo. También se puede usar la herencia pública.

// 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 también puede generarse como resultado del trabajo de conformidad del compilador efectuado para Visual Studio .NET 2003: las clases bases privadas son ahora innaccesibles. Una clase (A) que es una clase base privada a un tipo (B) no debe ser accesible para un tipo (C) que use B como clase base.

Para el código que es válido en las versiones de Visual Studio .NET 2003 y Visual Studio .NET de Visual C++, use el operador de ámbito.

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