В этом фрагменте кода:Неопределенная ссылка на статический constexpr
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
, в то время как лязг 3.7 дает ошибку во время компиляции:
declaration of constexpr static data member 'arr' requires an initializer
Что неправильно, и как должно быть определено static constexpr
вне декларации класса?
Но куда это должно идти? если он находится в заголовочном файле, будет ли множиться определение, если оно включено в несколько файлов? Если он находится в файле C++, то как компилятор обрабатывает разные спецификации? – user1244932
Поместите его в заголовок. Поскольку это определение шаблона, оно должно работать. –