2015-10-24 13 views
11

In questo frammento di codice:undefined reference to constexpr statica

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; 
} 

con gcc 5.2 ho avuto undefined reference to Foo<5ul>::arr, mentre clang 3.7 dà un errore di compilazione:

declaration of constexpr static data member 'arr' requires an initializer

Cosa c'è di sbagliato, e come deve essere definito static constexpr al di fuori della dichiarazione della classe?

risposta

7

Il definiton out-of-line è lo stesso che per altri statiche (non integrale) membri, meno l'inizializzazione:

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

Come gli altri membri statici, questo va alla conclusione di testa - come il modello di classe si.

+0

Ma dove dovrebbe andare? se è nel file di intestazione, otterrò la definizione di moltiplica se includo in più file? Se è in un file C++, allora come il compilatore gestisce diverse specilizzazioni? – user1244932

+3

Inseriscilo nell'intestazione. Poiché si tratta di una definizione di modello, deve funzionare. –

Problemi correlati