по

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

Ответы на вопрос(5)

Ваш ответ на вопрос