Compartir a través de


Error del compilador C2247

Actualización: noviembre 2007

Mensaje de error

No se puede tener acceso a 'identificador' porque 'clase' utiliza 'especificador' para heredar de 'clase'
'identifier' not accessible because 'class' uses 'specifier' to inherit from '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 se puede producir como resultado del trabajo de compatibilidad del compilador realizado para Visual Studio .NET 2003: control de acceso con miembros protegidos . Sólo se puede tener acceso a un miembro protegido (n) mediante una función miembro de una clase (B) que hereda de la clase (A) de la que es (n) miembro.

Para obtener más información, vea Resumen de cambios importantes en tiempo de compilación.

Para que el código sea válido en las versiones Visual Studio .NET 2003 y Visual Studio .NET de Visual C++, declare el miembro como friend del tipo. También es posible utilizar 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 se puede producir como resultado del trabajo de conformidad del compilador realizado para Visual Studio .NET 2003. ahora no se puede tener acceso a las clases base. Una clase (A) que es una clase base privada para un tipo (B) no debería ser accesible para un tipo (C) que utiliza B como clase base.

Vea Resumen de cambios importantes en tiempo de compilación para obtener más información.

Para que el código sea válido en las versiones Visual Studio .NET 2003 y Visual Studio .NET de Visual C++, utilice 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;
   }
};