Erreur du compilateur C2247
'identifier' n’est pas accessible, car 'class' utilise 'spécificateur' pour hériter de 'class'
identifier
est hérité d’une classe déclarée avec un accès privé ou protégé.
L’exemple suivant génère l’erreur 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
Cette erreur peut également être générée suite au travail de conformité du compilateur effectué pour Visual Studio .NET 2003 : contrôle d’accès avec des membres protégés. Un membre protégé (n) est accessible uniquement par le biais d’une fonction membre d’une classe (B) qui hérite de la classe (A) dont elle (n) est membre.
Pour le code valide dans les versions Visual Studio .NET 2003 et Visual Studio .NET de Visual C++, déclarez le membre comme un ami du type. L’héritage public peut également être utilisé.
// 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 peut également être généré suite au travail de conformité du compilateur qui a été effectué pour Visual Studio .NET 2003 : les classes de base privées sont désormais inaccessibles. Une classe (A) qui est une classe de base privée à un type (B) ne doit pas être accessible à un type (C) qui utilise B comme classe de base.
Pour le code valide dans les versions Visual Studio .NET 2003 et Visual Studio .NET de Visual C++, utilisez l’opérateur d’étendue.
// 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;
}
};