コンパイラ エラー C2248

'member': クラス 'class' で宣言された 'access_level' メンバーにアクセスできません

解説

派生クラスのメンバーは、基底クラスのメンバーにアクセス private できません。 クラス インスタンスにアクセスしたりprotected、クラス インスタンスのメンバーにアクセスprivateしたりすることはできません。

次の例では、クラスのメンバーが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 は、テンプレート フレンドと特殊化の使用に関する、準拠の問題が問題があるときにも発生します。 この問題を解決するには、空のテンプレート パラメーター リスト <> または特定のテンプレート パラメーターを使用してフレンド関数テンプレートを宣言します。

// 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 を公開するもう 1 つの準拠の問題を次に示します。クラスのフレンドを宣言しようとしていますが、クラスのスコープ内のフレンド宣言にはクラスが表示されません。 この問題を解決するには、外側のクラスにフレンド関係を許可します。

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