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