Для следующего кода
#include <array>
template<unsigned MaxP, typename type>
struct kernel
{
static constexpr unsigned max_pole(unsigned P)
{ return P>MaxP? MaxP:P; }
template<unsigned P>
using array = std::array<type,max_pole(P)>; // wrong?
template<unsigned P>
static void do_something(array<P> const&, array<P>&);
};
gcc 4.7.0 (g ++ -c -std = c ++ 11) дает
error: ‘max_pole’ was not declared in this scope
Это правильно (поведение компилятора)? Обратите внимание, что если я разрешу max_pole
заменив его kernel::max_pole
на указанной строке компилируется нормально.
РЕДАКТИРОВАТЬ Сообщено в bugzilla, принято как ошибка c ++ / 55992, см. http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55992. Также встречается с gcc 4.7.x и 4.8.0.
Ваш шаблон прекрасно компилируется с 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
является в обоих случаях неквалифицированное независимое имя, стратегия поиска должна быть одинаковой в обоих случаях, и это не так. Для меня это квалифицируется как ошибка.
Других решений пока нет …