3

サブクラステンプレートをプライベートとして宣言し、次にメンバーを保護として宣言するコードがあります。

class X {
private:
    template <class T>
    class Y {
    public:
        void somethingToDo();
        // definition
    };
protected:
    Y<SomeType> _protectedMember;
    // More definition
};

class Z : public virtual X{
public:
    void f();
}
void Z::f() {
    ...
    _protectedMember.somethingToDo();
}

もともと私はこれをgcc4.3.4でコンパイルし、それを受け入れました。次に、さまざまなプラットフォームでGCC、IBM、およびMicrosoftコンパイラーに対してビルドを試みるためにそれを送信しましたが、非gccコンパイラーはそれを拒否しました。これは、gcc(のこのバージョン)の標準への準拠を示すもののようです。しかし、結論を出す前に、技術的に正しいことを確認したいと思います。

ありがとう。

4

3 に答える 3

1

私はこれを以前に見たことがあると確信しています。これは当時GCCの既知のバグであり、その後修正されました。

于 2012-10-02T19:39:54.173 に答える
1

Y::somethingToDoあなたのプログラムは私には有効に見えます(無意味にプライベートであることを除いて)。Z::f()名前へのアクセスを要求しているのではなく、private名前だけを要求していますprotected

Z::f()を参照しようとすると、Y<T>コンパイラはエラーになります。しかし、Z::f()アクセス_protectedMemberしているだけで、確かに許可されています。

于 2012-10-02T19:56:47.620 に答える
0

Yテンプレートはプライベートであり、派生クラスからアクセスできるように意図されたwitchのように、プライベートではないコードでは使用できません。_protectedMemberまた、そのメンバーが派生クラスから見えるように、保護されていると宣言する必要があります。

原則として、あるスコープで変数に完全にアクセスできるようにする場合は、そのスコープでそのタイプに完全にアクセスできる必要があります。もちろん、コードは次の状況で現在の設計に役立つ可能性があります。

class Base {
    class PrivateClass {};
protected:
    PrivateClass _val;
    void doSomething( PrivateClass& v );
}

現在、派生クラスは呼び出しに使用できます_valdoSomething、メソッドを呼び出したり、プロパティを使用したりすることはできません。

于 2012-10-02T20:40:30.500 に答える