デフォルトでは、「依存名」がコンパイラに表示されないという事実を認識しています。しかし、他の SO の質問 ( here、here、および最終的には 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 にアクセスするための「従属名」法をどのように回避すればよいでしょうか?