У меня есть дочерний класс (Child), который наследует базовый класс (Base), основанный на дочернем классе. Дочерний класс также является шаблоном для типа (может быть целым или любым другим …), и я пытаюсь получить доступ к этому типу в базовом классе, я пробовал много вещей без успеха … вот что я думаю может быть ближе к рабочему решению, но оно не компилируется …
template<typename ChildClass>
class Base
{
public:
typedef typename ChildClass::OtherType Type;
protected:
Type test;
};
template<typename TmplOtherType>
class Child
: public Base<Child<TmplOtherType> >
{
public:
typedef TmplOtherType OtherType;
};
int main()
{
Child<int> ci;
}
вот что говорит мне gcc:
test.cpp: в экземпляре «Base>»: test.cpp: 14: 7:
создается из «Child» test.cpp: 23: 16: создается из
здесь test.cpp: 7: 48: ошибка: в классе нет типа с именем «OtherType»
Детская
Вот рабочее решение, которое эквивалентно:
template<typename ChildClass, typename ChildType>
class Base
{
public:
typedef ChildType Type;
protected:
Type test;
};
template<typename TmplOtherType>
class Child
: public Base<Child<TmplOtherType>, TmplOtherType>
{
public:
};
Но что меня беспокоит, так это повторяющийся параметр шаблона (пересылающий TmplOtherType как Childtype) в базовый класс …
Что, вы парни, думаете ?
Вы могли бы использовать параметр шаблона чтобы избежать повторяющихся аргументов шаблона:
template<template<typename>class ChildTemplate, //notice the difference here
typename ChildType>
class Base
{
typedef ChildTemplate<ChildType> ChildClass; //instantiate the template
public:
typedef ChildType Type;
protected:
Type test;
};
template<typename TmplOtherType>
class Child
: public Base<Child, TmplOtherType> //notice the difference here also
{
public:
};
Других решений пока нет …