Błąd kompilatora C2248

"member": nie może uzyskać dostępu do składowej "access_level" zadeklarowanej w klasie "class"

Uwagi

Składowe klasy pochodnej nie mogą uzyskiwać dostępu do private składowych klasy bazowej. Nie można uzyskać dostępu do private wystąpień klas ani protected ich składowych.

Przykład

Poniższy przykład generuje C2248, gdy private lub protected składowe klasy są dostępne spoza klasy. Aby rozwiązać ten problem, nie należy uzyskiwać dostępu do tych elementów członkowskich bezpośrednio poza klasą. Używanie public danych składowych i funkcji składowych do interakcji z klasą.

// 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
}

Innym problemem zgodności, który uwidacznia C2248, jest użycie znajomych i specjalizacji szablonu. Aby rozwiązać ten problem, zadeklaruj szablony funkcji znajomych przy użyciu pustej listy <> parametrów szablonu lub określonych parametrów szablonu.

// 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);
}

Oto kolejny problem zgodności, który uwidacznia C2248: Próbujesz zadeklarować znajomego klasy, ale klasa nie jest widoczna dla deklaracji znajomej w zakresie klasy. Aby rozwiązać ten problem, przyznaj przyjaźń otaczającej klasie.

// 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
};