Derleyici Hatası C2248
'member': 'class' sınıfında bildirilen 'access_level' üyesine erişemiyor
Açıklamalar
Türetilmiş bir sınıfın üyeleri temel sınıfın üyelerine erişemez private
. Sınıf örneklerine veya protected
üyelerine erişemezsinizprivate
.
Örnek
Aşağıdaki örnek, veya protected
bir sınıfın üyelerine sınıfın dışından erişildiğinde private
C2248 oluşturur. Bu sorunu çözmek için bu üyelere doğrudan sınıfın dışından erişemezsiniz. Sınıfla etkileşime geçmek için üye verilerini ve üye işlevlerini kullanın public
.
// 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
}
C2248'i kullanıma sunan bir diğer uyumluluk sorunu da şablon arkadaşlarınızın kullanılması ve uzmanlaşmadır. Bu sorunu çözmek için boş bir şablon parametre listesi <>
veya belirli şablon parametreleri kullanarak arkadaş işlevi şablonlarını bildirin.
// 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);
}
C2248'i kullanıma sunan başka bir uyumluluk sorunu daha: Sınıfın bir arkadaşını bildirmeye çalışıyorsunuz, ancak sınıf, sınıfın kapsamında arkadaş bildirimine görünmüyor. Bu sorunu çözmek için kapsayan sınıfa arkadaşlık verin.
// 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
};