Errore del compilatore C2248
'member': non è possibile accedere al membro 'access_level' dichiarato nella classe 'class'
Osservazioni:
I membri di una classe derivata non possono accedere ai private
membri di una classe di base. Non è possibile accedere o membri private
protected
di istanze di classe.
Esempio
L'esempio seguente genera l'errore C2248 quando private
o protected
i membri di una classe sono accessibili dall'esterno della classe . Per risolvere questo problema, non accedere a questi membri direttamente all'esterno della classe . Usare public
i dati dei membri e le funzioni membro per interagire con la classe .
// C2248_access.cpp
// compile with: cl /EHsc /W4 C2248_access.cpp
#include <stdio.h>
class X {
public:
int m_publicMember;
void setPrivateMember( int i ) {
m_privateMember = i;
printf_s("\n%d", m_privateMember);
}
protected:
int m_protectedMember;
private:
int m_privateMember;
} x;
int main() {
x.m_publicMember = 4;
printf_s("\n%d", x.m_publicMember);
x.m_protectedMember = 2; // C2248 m_protectedMember is protected
x.m_privateMember = 3; // C2248 m_privMemb is private
x.setPrivateMember(0); // OK uses public access function
}
Un altro problema di conformità che espone C2248 è l'uso di amici modello e specializzazione. Per risolvere questo problema, dichiarare i modelli di funzione Friend usando un elenco <>
di parametri di modello vuoto o parametri di modello specifici.
// C2248_template.cpp
// compile with: cl /EHsc /W4 C2248_template.cpp
template<class T>
void f(T t) {
t.i; // C2248
}
struct S {
private:
int i;
public:
S() {}
friend void f(S); // refer to the non-template function void f(S)
// To fix, comment out the previous line and
// uncomment the following line.
// friend void f<S>(S);
};
int main() {
S s;
f<S>(s);
}
Ecco un altro problema di conformità che espone C2248: si tenta di dichiarare un amico di una classe, ma la classe non è visibile alla dichiarazione friend nell'ambito della classe . Per risolvere questo problema, concedere amicizia alla classe contenitore.
// C2248_enclose.cpp
// compile with: cl /W4 /c C2248_enclose.cpp
class T {
class S {
class E {};
};
friend class S::E; // C2248
};
class A {
class S {
class E {};
friend class A; // grant friendship to enclosing class
};
friend class S::E; // OK
};