доступ к аргументу дочернего шаблона в базовом классе (на основе дочернего класса)

У меня есть дочерний класс (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) в базовый класс …

Что, вы парни, думаете ?

1

Решение

Вы могли бы использовать параметр шаблона чтобы избежать повторяющихся аргументов шаблона:

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:
};
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]