Я прочитал статью Wikipedia о любопытно повторяющемся шаблоне шаблона в С++ для выполнения статического (read: compile-time) полиморфизма. Я хотел обобщить его так, чтобы я мог изменять возвращаемые типы функций на основе производного типа. (Кажется, это должно быть возможно, поскольку базовый тип знает производный тип из параметра шаблона). К сожалению, следующий код не будет компилироваться с использованием 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> { ... };
EDIT:
Сообщение об ошибке, которое 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>'