статическая функция-член 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 = 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.

13

Решение

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

9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]