Подтвердить что ты не робот

Статическая функция constexpr в шаблонах с использованием выражения не найдено

Для следующего кода

#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 = С++ 11) дает

error: ‘max_pole’ was not declared in this scope

Правильно ли это (поведение компилятора)? Обратите внимание, что если я разрешаю max_pole, заменив его на kernel::max_pole в указанной строке, он компилируется отлично.

EDIT Сообщено об ошибке bugzilla, принятой как ошибка С++/55992, см. http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55992. Также происходит с gcc 4.7.x и 4.8.0.

4b9b3361

Ответ 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 в обоих случаях неквалифицированное независимое имя, стратегия поиска должна быть одинаковой в обоих случаях, а это не так. Для меня это квалифицирует его как ошибку.