Sdílet prostřednictvím


Chyba kompilátoru C2248

'member': nemůže získat přístup k členu "access_level" deklarovaného ve třídě 'class'

Poznámky

Členové odvozené třídy nemají přístup k private členům základní třídy. Nemůžete získat přístup ani privateprotected členové instancí třídy.

Příklad

Následující ukázka vygeneruje C2248, když private nebo protected členové třídy jsou přístupní zvenčí třídy. Pokud chcete tento problém vyřešit, nepřistupujte k těmto členům přímo mimo třídu. K interakci s třídou použijte public členová data a členské funkce.

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

Dalším problémem shody, který zveřejňuje C2248, je použití přátel šablon a specializace. Pokud chcete tento problém vyřešit, deklarujte šablony přátelských funkcí pomocí prázdného seznamu <> parametrů šablony nebo konkrétních parametrů šablony.

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

Tady je další problém s shodami, který zveřejňuje C2248: Pokusíte se deklarovat přítele třídy, ale třída není viditelná pro deklaraci přítele v oboru třídy. Chcete-li tento problém vyřešit, udělte přátelství uzavřené třídě.

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