по
читалСтатья в википедии о странно повторяющемся шаблонном шаблоне в 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>'