컴파일러 오류 C2248
'member': 'class' 클래스에 선언된 'access_level' 멤버에 액세스할 수 없습니다.
설명
파생 클래스의 멤버는 기본 클래스의 멤버에 액세스할 private
수 없습니다. 클래스 인스턴스의 멤버나 protected
액세스 private
는 할 수 없습니다.
예시
다음 샘플에서는 클래스 외부에서 클래스의 멤버에 protected
액세스할 때 private
C2248을 생성합니다. 이 문제를 해결하려면 클래스 외부에서 직접 이러한 멤버에 액세스하지 마세요. 멤버 데이터 및 멤버 함수를 사용하여 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을 노출하는 또 다른 규칙 문제는 템플릿 친구 및 전문화를 사용하는 것입니다. 이 문제를 해결하려면 빈 템플릿 매개 변수 목록 <>
또는 특정 템플릿 매개 변수를 사용하여 friend 함수 템플릿을 선언합니다.
// 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을 노출하는 또 다른 규칙 문제는 다음과 같습니다. 클래스의 친구를 선언하려고 하지만 클래스 범위의 friend 선언에는 클래스가 표시되지 않습니다. 이 문제를 해결하려면 바깥쪽 클래스에 우정을 부여합니다.
// 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
};