Delen via


Compilerfout C2248

'lid': kan geen toegang krijgen tot 'access_level' lid dat is gedeclareerd in klasse 'klasse'

Opmerkingen

Leden van een afgeleide klasse hebben geen toegang tot private leden van een basisklasse. U hebt geen toegang tot private of protected leden van klasse-exemplaren.

Voorbeelden

In het volgende voorbeeld wordt C2248 gegenereerd wanneer private of protected leden van een klasse toegankelijk zijn van buiten de klas. U kunt dit probleem oplossen door deze leden niet rechtstreeks buiten de klas te openen. Gebruik public lidgegevens en lidfuncties om met de klasse te communiceren.

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

Een ander conformanceprobleem dat C2248 beschikbaar maakt, is het gebruik van sjabloonvrienden en specialisatie. U kunt dit probleem oplossen door vriendfunctiesjablonen te declareren met behulp van een lege sjabloonparameterlijst <> of specifieke sjabloonparameters.

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

Hier volgt een ander probleem met de conformiteit waarmee C2248 wordt weergegeven: u probeert een vriend van een klasse te declareren, maar de klasse is niet zichtbaar voor de declaratie van de vriend in het bereik van de klasse. Om dit probleem op te lossen, verleent u vriendschap aan de insluitklasse.

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