Статический полиморфизм C ++ (CRTP) и использование определений типов из производных классов

Я прочитал статью в Википедии о любопытном повторяющемся шаблоне в C ++ для выполнения статического (читай: во время компиляции) полиморфизма. Я хотел обобщить его, чтобы можно было изменить типы возвращаемых функций на основе производного типа. (Кажется, что это должно быть возможно, поскольку базовый тип знает производный тип из параметра шаблона). К сожалению, следующий код не будет компилироваться с использованием MSVC 2010 (я не У меня сейчас легкий доступ к gcc, поэтому я еще не пробовал его). Кто-нибудь знает, почему?

template 
class base {
public:
    typedef typename derived_t::value_type value_type;
    value_type foo() {
        return static_cast(this)->foo();
    }
};

template 
class derived : public base > {
public:
    typedef T value_type;
    value_type foo() {
        return T(); //return some T object (assumes T is default constructable)
    }
};

int main() {
    derived a;
}

Кстати, у меня есть обходной путь с использованием дополнительных параметров шаблона, но мне это не нравится - он будет очень подробным при передаче многих типов вверх по цепочке наследования.

template 
class base { ... };

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

EDIT:

Сообщение об ошибке, которое MSVC 2010 выдает в этой ситуации: ошибка C2039: 'value_type': не является членом 'производного '

g ++ 4.1.2 (через codepad.org ) сообщает об ошибке : нет типа с именем 'value_type' в 'производном классе '

61
задан T.C. 4 September 2014 в 09:44
поделиться