Я был бы признателен за некоторые объяснения, почему следующий код вызывает ошибку компиляции:
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, потому что грех также не может быть.
К сожалению, все это было сделано для инициализации статического массива во время компиляции, но кажется, что это невозможно.
constexpr static
члены могут быть инициализированы только внутри тела класса, если инициализатор также constexpr
,
Ваш fun
функция содержит вызов sin
который, как и большинство стандартных математических функций, не constexpr
,
Других решений пока нет …