13

デフォルトでは、「依存名」がコンパイラに表示されないという事実を認識しています。しかし、他の SO の質問 ( herehere、および最終的には C++ faq ) への回答で、using宣言が役立つ可能性があると言われました。

だから私は試しました。

テンプレート基本クラス:

// regardless of the fact that members are exposed...
template<typename T>
struct TBase {
   typedef T MemberType;
   MemberType baseMember;
   MemberType baseFunction() { return MemberType(); }
};

ベースのメンバーを使用した派生クラス:

template<typename T>
struct TDerived : public TBase<T> {
   // http://www.parashift.com/c++-faq-lite/nondependent-name-lookup-members.html
   // tells us to use a `using` declaration.
   using typename TBase<T>::MemberType;
   using TBase<T>::baseFunction;
   using TBase<T>::baseMember;

   void useBaseFunction() { 
      // this goes allright.
      baseFunction();
      ++baseMember;

      // but here, the compiler doesn't want to help...
      MemberType t; //error: expected `;' before ‘t’
   }
};

これを ideone で試しました。gcc-4.3.3 と gcc-4.5.1 があります

これは予想される動作ですか?親テンプレート クラスのメンバ typedef にアクセスするための「従属名」法をどのように回避すればよいでしょうか?

4

1 に答える 1

20

あなたはおそらくやりたい:

using MemberType = typename TBase<T>::MemberType; // new type alias syntax

また

typedef typename TBase<T>::MemberType MemberType; // old type alias syntax

この構文using Base::member;は、非型メンバーの宣言をスコープに入れるためにのみ使用できます。


また、これらのいずれも実際には必要ないことに注意してください。それぞれの使用を修飾することができます (ベースを持つ型の場合、どちらかまたはベースを持つ非型の場合this->)。これにより、シンボルが依存するようになります。

于 2012-11-15T20:40:46.827 に答える