C ++ polimorfismo estático (CRTP) y usando typedefs de clases derivadas

Yo leo elWikipedia article sobre el patrón de plantilla curiosamente recurrente en C ++ para hacer un polimorfismo estático (léase: tiempo de compilación). Quería generalizarlo para poder cambiar los tipos de retorno de las funciones en función del tipo derivado. (Esto parece que debería ser posible ya que el tipo base conoce el tipo derivado del parámetro de plantilla). Desafortunadamente, el siguiente código no se compilará usando MSVC 2010 (no tengo acceso fácil a gcc en este momento, así que aún no lo he probado). Alguien sabe por qué?

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;
}

BTW, tengo una solución alternativa usando parámetros de plantilla adicionales, pero no me gusta --- se volverá muy detallado al pasar muchos tipos por la cadena de herencia.

template <typename derived_t, typename value_type>
class base { ... };

template <typename T>
class derived : public base<derived<T>,T> { ... };

EDITAR

El mensaje de error que MSVC 2010 da en esta situación eserror C2039: 'value_type' : is not a member of 'derived<T>'

g ++ 4.1.2 (a través de codepad.org) diceerror: no type named 'value_type' in 'class derived<int>'

Respuestas a la pregunta(5)

Su respuesta a la pregunta