Я пишу сильно шаблонный кусок кода на C ++.Он отлично работал в VS 2005, но когда я пытаюсь скомпилировать его в g ++, я получаю некоторые действительно странные ошибки.
Необходимая часть кода (упрощенная до минимума, тоже не компилируется) выглядит следующим образом:
template <class Actual>
class Generic
{
public:
typedef Actual ThisType;
};
template <class Actual>
class Intermediate : public Generic<Actual>
{
};
template <class Q>
class Derived : public Intermediate<Derived<Q> >
{
public:
void FooBar()
{
ThisType q;
}
};
Ошибка: «ThisType» не был объявлен в этой области »в строке, где объявляется« q ».
Любопытно, что все работает нормально, когда Derived не являетсяшаблон, но простой класс.Зачем компилятору искать реализацию функции шаблона еще до того, как он будет создан?Я знаю, что VC ++ слишком мало проверяет при компиляции шаблонов (неиспользуемые шаблоны могут даже содержать синтаксически некорректный код) - но не слишком ли много здесь проверяет g ++?Я попытался добавить ключевое слово typename без особой надежды, и это тоже не удалось.Есть ли способ заставить ThisType работать как положено?Я боюсь добавить его вручную в каждый производный класс - это громоздко, избыточно, не элегантно и приводит к ошибкам.
С уважением, MZ