Ответ 1
Ваш шаблон компилируется с помощью Clang 3.2. Я твердо верю, что это ошибка GCC (которая также присутствует в GCC 4.7.2, кстати). Заметки о замене для GCC 4.8.0, похоже, не упоминают о таком исправлении.
Также обратите внимание, что ошибка компиляции исчезает, если вы удаляете объявление do_something<>
, которое не должно иметь никакого значения.
Еще один намек: в то время как этот шаблон выполняет не компиляцию на GCC 4.7.2:
template<unsigned MaxP, typename type>
struct kernel
{
static constexpr unsigned max_pole(unsigned P)
{ return P>MaxP? MaxP:P; }
template<typename T>
using array2 = int[max_pole(3)]; // ERROR!
static void do_something(array2<int> const&, array2<int>&);
};
Этот шаблон выполняет:
template<unsigned MaxP, typename type>
struct kernel
{
static constexpr unsigned max_pole(unsigned P)
{ return P>MaxP? MaxP:P; }
// template<typename T> <--- removed
using array2 = int[max_pole(3)]; // OK
static void do_something(array2 const&, array2&);
};
Так как max_pole
в обоих случаях неквалифицированное независимое имя, стратегия поиска должна быть одинаковой в обоих случаях, а это не так. Для меня это квалифицирует его как ошибку.