ウィキペディアの記事で、静的 (コンパイル時) ポリモーフィズムを行うための C++ での奇妙に繰り返されるテンプレート パターンについて読みました。派生型に基づいて関数の戻り値の型を変更できるように、それを一般化したかったのです。(基本型はテンプレート パラメーターからの派生型を認識しているため、これは可能であるように思われます)。残念ながら、次のコードは MSVC 2010 を使用してコンパイルできません (現在 gcc に簡単にアクセスできないため、まだ試していません)。理由を知っている人はいますか?
template <typename derived_t>
class base {
public:
typedef typename derived_t::value_type value_type;
value_type foo() {
return static_cast<derived_t*>(this)->foo();
}
};
template <typename T>
class derived : public base<derived<T> > {
public:
typedef T value_type;
value_type foo() {
return T(); //return some T object (assumes T is default constructable)
}
};
int main() {
derived<int> a;
}
ところで、追加のテンプレート パラメータを使用する回避策がありますが、私はそれが好きではありません。多くの型を継承チェーンに渡すと非常に冗長になります。
template <typename derived_t, typename value_type>
class base { ... };
template <typename T>
class derived : public base<derived<T>,T> { ... };
編集:
この状況で MSVC 2010 が表示するエラー メッセージは次のとおりです。error C2039: 'value_type' : is not a member of 'derived<T>'
g++ 4.1.2 ( codepad.org経由) によるとerror: no type named 'value_type' in 'class derived<int>'