编译器错误 C2248
“member”:无法访问类“class”中声明的“access_level”成员
备注
派生类的成员不能访问基类的 private
成员。 无法访问类实例的 private
或 protected
成员。
示例
当从类外部访问类的 private
或 protected
成员时,以下示例会生成 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 的另一个一致性问题是模板友元和专用化的使用。 若要解决此问题,请使用空模板参数列表 <>
或特定模板参数声明友元函数模板。
// 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 的另一个一致性问题:尝试声明一个类的友元,但该类对类范围内的友元声明不可见。 若要解决此问题,请向封闭类授予友元关系。
// 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
};