crtp — шаблон повторяющегося шаблона C ++, включая вложенный родительский шаблон

Пожалуйста, помогите, мне нужно отделить повторяющуюся зависимость в следующем (не фактическом, просто иллюстративном) коде MSVC 2005 года. Я компилирую с g ++ следующим образом:

g++ -std=c++x -I. -o -Wall -Wextra -pedantic example example.cpp

Код:

template <typename R> struct AAA
{
typedef R rep_t;

static function(rep_t n, rep_t d) {return d;}
};

template <typename T> struct HELPER_CLASS
{
//arithmetic operators:

friend T operator/ (T const& lhs) {T res; res /=lhs; return res;}

//... so on, also for comparison operators
}

template <typename  T=long> class BBB : public HELPER_CLASS< BBB<T> >
{

typedef typename HELPER_CLASS< BBB<T> >::template AAA<T> P;
typedef typename AAA<T>::rep_t rep_t;

public:
BBB& operator/=(BBB const& that)
{this->rep_=P::function(this->rep_, that.rep_); return *this;}

private:
rep_t rep_;
}

Компилируя это, я получаю следующую ошибку:

ошибка: нет шаблона класса с именем «AAA» в «struct HELPER_CLASS>»

Когда я объявляю AAA внутри HELPER_CLASS, чтобы это выглядело так:

template <typename T> struct HELPER_CLASS
{
//arithmetic operators:
friend T operator/ (T const& lhs)

{T res; res /=lhs; return res;}
//etc. for e.g. comparison operators

template <typename R> struct AAA;
};

Я остался с этой ошибкой:

ошибка: неполный тип HELPER_CLASS< BBB> :: AAA ‘используется в описателе вложенного имени.

Есть ли способ убедить g ++ относиться к этим вещам так же свободно, как к MSVC?

Как я могу убедиться, что тип будет определен, как только он понадобится?
Спасибо!

2

Решение

Задача ещё не решена.

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

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

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