Пожалуйста, помогите, мне нужно отделить повторяющуюся зависимость в следующем (не фактическом, просто иллюстративном) коде 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?
Как я могу убедиться, что тип будет определен, как только он понадобится?
Спасибо!
Задача ещё не решена.
Других решений пока нет …