在这段代码片段中:
template <size_t N> struct Foo { static constexpr std::array<char,N> arr{{0}}; static const char *data() { return &arr[0]; } }; template<> constexpr std::array<char,5> Foo<5>::arr; int main() { std::cout << Foo<5>::data() << std::endl; }
与gcc 5.2我得到未定义的引用Foo< 5ul> :: arr,而clang 3.7给出编译时错误:
declaration of constexpr static data member ‘arr’ requires an initializer
什么是错误的,应该如何在类声明之外定义静态constexpr?
解决方法
离线定义与其他静态(非整数)成员相同,减去初始化:
template<size_t N> constexpr std::array<char,N> Foo<N>::arr;
像其他静态成员一样,这在头文件中就像类模板本身一样.