2016-08-27 17 views
5

Минимальный код, который я был в состоянии произвести, чтобы воспроизвести проблему:Является ли законным расширение пакета параметров не-типа для определения внутреннего шаблона класса с параметрами шаблона без типа?

template <int> 
struct Tag { }; 

Tag<0> w; 

template <int... Is> 
struct Outer { 
    template <Tag<Is> &...> 
    struct Inner { 
    }; 
}; 

int main() { 
    Outer<0>::Inner<w> f; 
} 

г ++ (версия 6.1.1 20160511) наталкивается следующее сообщение об ошибке при компиляции кода:

pp.cc: In function ‘int main()’: 
pp.cc:14:21: internal compiler error: unexpected expression ‘Is’ of kind template_parm_index 
    Outer<0>::Inner<w> f; 

И производит длинную и скучную трассировку стека. clang ++ в версии 3.6.0, похоже, не имеет проблем с компиляцией кода. Тот же самый код с параметрами шаблона типа компилируется нормально в обоих компиляторов:

template <class> 
struct Tag { }; 

Tag<int> w; 

template <class... Ts> 
struct Outer { 
    template <Tag<Ts> &...> 
    struct Inner { 
    }; 
}; 

int main() { 
    Outer<int>::Inner<w> f; 
} 

Так это г ++ ошибка или я упускаю что-то важное о не-типа VARIADIC расширения параметров шаблона, который не относится к расширению параметров шаблона класса ?

+11

«внутренняя ошибка компилятора» явно означает ошибку в НКУ, независимо от этого действует C++ или нет , – kennytm

+2

Спасибо! Я не знал, что ... –

+0

Что такое синтаксис 'template & ...> struct Inner {};' mean? – Zereges

ответ

0

(Не ответ, но кто-то может быть интересно)

Возможные относительно простой обходной путь для GCC:

template <int> 
struct Tag { }; 

Tag<0> w; 

template <class... Ts> 
struct OuterParent { 
    template <Ts&...> 
    struct Inner { 
    }; 
}; 

template <int... Is> 
struct Outer:OuterParent<Tag<Is>...> { 
}; 

int main() { 
    Outer<0>::Inner<w> f; 
}