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?
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
Inseriscilo nell'intestazione. Poiché si tratta di una definizione di modello, deve funzionare. –