Ошибка компоновщика со статической переменной-членом constexpr

Я был бы признателен за некоторые объяснения, почему следующий код вызывает ошибку компиляции:
undefined reference to sinet::testtable'
Вот фактический код:

#define TABLE_SIZE 2000
template<class Function, std::size_t... Indices>
constexpr static auto make_array_helper(Function f, std::index_sequence<Indices...>)
-> std::array<typename std::result_of<Function(std::size_t)>::type, sizeof...(Indices)>
{
return {{ f(Indices)... }};
}

template<int N, class Function>
constexpr static auto make_array(Function f)
-> std::array<typename std::result_of<Function(std::size_t)>::type, N>
{
return make_array_helper(f, std::make_index_sequence<N>{});
}
constexpr static float fun(double x) { return (float)sin(((double)x / (double)TABLE_SIZE) * M_PI * 2.0); }

class sinet{

public:
constexpr static auto testtable = make_array<TABLE_SIZE>(fun);
};

Код должен заполнять статический массив во время компиляции, и он работает до тех пор, пока constexpr static array не является членом

Если я инициализирую статический элемент как один с плавающей точкой, он работает, как и в случае ошибок компоновщика. Но почему?

Было много подобных вопросов, но я не мог разглядеть ответ, специфичный для моего примера.

Любая помощь будет принята с благодарностью.

РЕДАКТИРОВАТЬ:

Благодаря ответу djrollins, я теперь знаю, что статический член не может быть оценен как constexpr, потому что грех также не может быть.

К сожалению, все это было сделано для инициализации статического массива во время компиляции, но кажется, что это невозможно.

2

Решение

constexpr static члены могут быть инициализированы только внутри тела класса, если инициализатор также constexpr,

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

2

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector