olimorfismo estático em C ++ (CRTP) e usando typedefs de classes derivad

Eu li ortigo @Wikipedia sobre o padrão de modelo curiosamente recorrente em C ++ para fazer polimorfismo estático (leia-se em tempo de compilação). Eu queria generalizá-lo para poder alterar os tipos de retorno das funções com base no tipo derivado. (Parece que isso deve ser possível, pois o tipo base conhece o tipo derivado do parâmetro do modelo). Infelizmente, o código a seguir não será compilado usando o MSVC 2010 (não tenho acesso fácil ao gcc no momento, então ainda não o testei). Alguém sabe o porquê?

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, eu tenho uma solução alternativa usando parâmetros de modelo extras, mas não gosto disso - ele ficará muito detalhado ao passar muitos tipos na cadeia de heranç

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

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

EDITAR

A mensagem de erro que o MSVC 2010 dá nessa situação éerror C2039: 'value_type' : is not a member of 'derived<T>'

g ++ 4.1.2 (via codepad.org) dizerror: no type named 'value_type' in 'class derived<int>'

questionAnswers(5)

yourAnswerToTheQuestion