2015-10-24 2 views
11

В этом фрагменте кода:Неопределенная ссылка на статический 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 вне декларации класса?

ответ

7

неработающей линии Definiton такая же, как и для других статических (не целочисленные) членов, за вычетом инициализации:

template<size_t N> 
constexpr std::array<char, N> Foo<N>::arr; 

Как и другие статические члены, это идет в заголовок - как шаблон класса сам.

+0

Но куда это должно идти? если он находится в заголовочном файле, будет ли множиться определение, если оно включено в несколько файлов? Если он находится в файле C++, то как компилятор обрабатывает разные спецификации? – user1244932

+3

Поместите его в заголовок. Поскольку это определение шаблона, оно должно работать. –