11
「依存名」がデフォルトでコンパイラに表示されないという事実に気付いています。しかし、他のSOの質問(here、here、そして最終的には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にアクセスするための '従属名'法を回避するにはどうすればよいですか?
この問題が発生しました。答えを見つけ、派生クラスの "this->"を使って魅力的に働きました。ありがとう。 –
実際には、構文を使用することができますが、typenameを使用する必要があります。typename TBase :: MemberType; –
RiaD