我希望得到一些解释,为什么以下代码会产生编译错误:
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的回答,我现在知道静态的memeber无法被评估为constexpr,因为罪恶也不能。
这是不幸的,因为所有这些都是在编译时初始化静态数组,但似乎这是不可能的。
答案 0 :(得分:2)
constexpr static
, constexpr
成员只能在类正文中初始化。
您的fun
函数包含对sin
的调用,与大多数标准数学函数一样,它不是constexpr
。