У меня есть следующий фрагмент.
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;
}
Это вызывает ту же ошибку. Я думаю, это опровергает аргумент о неполном типе.