рекурсивно вложенные шаблоны - ошибка gcc?

У меня есть следующий фрагмент.

template< typename T >
struct f
{
  template< typename V >
  struct a : f
  {};
};

int main ()
{
  f<int>::a<int>::a<double> x;
}

Он компилируется без предупреждений в GCC 4.4.5 и MSVC 2010, но не в GCC 4.5.2 - при этом я получаю следующие ошибки:

test.cc: In function 'int main()':
test.cc:11:21: error: expected primary-expression before 'double'
test.cc:11:21: error: expected ';' before 'double'

Так что пока я не вижу в этом ничего нестандартного, вопрос обязательный - законно ли это в C ++? Кроме того, если это так, как мне отправить отчет об ошибке в GCC? (:

edit : Небольшая предыстория для любопытных:

Предполагается, что это часть метапрограммирования шаблона. f в основном имеет структуру класса метафункций шаблона с ] apply заменен на a (конечно, вложенный тип из apply опущен, поэтому мы можем сосредоточиться на самой структуре).

Наследование в данном случае это стандартное устройство для привязки возвращаемых значений метафункций. Этот фрагмент пытается достичь класса метафункции, который рекурсивно дает себя при оценке.

edit2 : позвольте мне поставить тот же фрагмент немного по-другому:

template< typename T >
struct f
{
  template< typename V > struct a;
};

template< typename T >
template< typename V >
struct f<T>::a : f<T>
{};

int main ()
{
  f<int>::a<int>::a<double> x;
}

Это вызывает ту же ошибку. Я думаю, это опровергает аргумент о неполном типе.

6
задан xcvii 2 May 2011 в 18:03
поделиться