シナリオは次のとおりです。
template <template <typename> class T, typename V>
struct parent {
void do_something();
};
template <typename V>
struct child : public parent<child, V> {
void do_something(V argument);
using parent<child, V>::do_something; // C3200: invalid template argument for template parameter 'IMPL', expected a class template
};
上記のコードは、指定された行で指定されたエラー (MSVC 9.0) でコンパイルに失敗します。ただし、代わりにこれを書くと、のクラス定義の外にchild
:
template <typename V>
struct parent_identity_meta {
typedef typename parent<child, V> type; // no error!
};
内で次のことを正常に実行できるようになりましたchild
。
using parent_identity_meta<V>::type::do_something;
テンプレートに対して typedef できないという制限 (C++ 11 で軽減) があることは知っていますが、ここで実行しているのはそのようなものではないと思います。そうしないと、typedefparent_identity_meta
が失敗します。独自のクラス定義内にない場合はテンプレートchild
を参照し、それ自体から生成されたクラスを参照しているようです。
これはかなり理解できます (child<V>
毎回書かなければならないのは苦痛です)。しかし、この動作を無効にする方法はありますか?