Я хотел создать класс шаблона, который предоставил бы общие средства для класса, чтобы иметь член m_Type
, который обозначает какой-то тип, предоставляемый наследующим классом. Рассмотрим это:CRTP с вложенным типом
template<typename T>
struct TypeAttribute
{
T m_Type;
};
template<typename T>
struct TypeAttribute2
{
using Type = typename T::Type;
Type m_Type;
};
struct Foo : TypeAttribute<Foo::Type>
{
enum class Type
{
Type1
};
};
struct Bar : TypeAttribute2<Bar>
{
enum class Type
{
Type1
};
};
Оба из них не из-за неполных типов (в первом случае Foo::Type
и во втором Bar::Type
), который является понятным. Я пропускаю что-то тривиальное или это просто неправильный подход, и я должен перемещать вложенные типы вне классов (я просто хотел, чтобы классы содержали соответствующие типы внутри себя, чтобы не заполнять более высокие пространства имен). Live demo here.
Ну, как я уже говорил, я знал, что типы являются неполными - Я надеялся, что это может быть какой-то C++ 11 магии будет преодолеть это. Поэтому мне просто нужно перечислить перечисления в более широком диапазоне. –