編譯器錯誤 C2248
' member ': 無法存取類別 ' class ' 中宣告的 ' access_level ' 成員
備註
衍生類別的成員無法存取 private
基類的成員。 您無法存取 private
或 protected
類別實例的成員。
範例
下列範例會在類別外部存取 類別或 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
};