1

CRTP を使用していますが、派生クラスの保護されたメンバーへのアクセスに問題があります。

私のコードに近い例を次に示します。

template< typename Self>
  class A {
  public:
      void foo( ) {
          Self s;
          s._method( s); //ERROR, because _method is protected
      }

  protected:
      virtual  void _method( const Self & b) = 0;
  };

class B : public A< B> {
protected:
    void _method( const B & b) {}
};

私は友人のキーワードを使用しなければならないことを理解しました。しかし、クラスA< Self> のどこに置くべきかわかりません。void _method( const B &b)をBで公開できることはわかっていますが、そうしたくありません。Bでキーワードを使用することも、私には不可能です。

4

2 に答える 2

2

私はちょうど解決策を見つけました。回答ありがとうございます。この行を変更するだけです:

s._method( s); //ERROR, because _method is protected

( ( A< Self> &) s)._method( s);

そしてそれはうまくいきます!http://ideone.com/CjclqZ

于 2014-11-19T17:37:35.547 に答える