2012-11-15 9 views
11

「依存名」がデフォルトでコンパイラに表示されないという事実に気付いています。しかし、他のSOの質問(herehere、そして最終的にはon the C++ faq)への回答では、using宣言が役に立つかもしれないと言われました。テンプレートの基本クラスのtypedefメンバーが見えない

だから私は試しました。

テンプレートベースクラスベースのメンバを使用して

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

私はthis out on ideoneを試してみました。これはgcc-4.3.3とgcc-4.5.1を持っています

この動作は期待されていますか?親テンプレートクラスのメンバーtypedefにアクセスするための '従属名'法を回避するにはどうすればよいですか?

答えて

18

あなたはおそらく何をしたい:

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

または

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

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


はまた、これらのどれもが実際に必要とされていない、あなたは(this->または塩基との非型の基本とタイプのため、)それぞれの使用を限定することができ、それはシンボルが依存させることに注意してください。

+0

この問題が発生しました。答えを見つけ、派生クラスの "this->"を使って魅力的に働きました。ありがとう。 –

+0

実際には、構文を使用することができますが、typenameを使用する必要があります。typename TBase :: MemberType; – RiaD

関連する問題