2013-06-30 3 views
11

Prendere il seguente pezzo di codice:Un caso curioso con riferimenti e membri della classe statici

#include <type_traits> 
#include <iostream> 

template <class T> 
void print(T &&t){ 
    std::cout << t << std::endl; 
} 

template<class T, T val> 
struct Foo{ 
    static constexpr T value = val; 
}; 

int main(){ 
    print(Foo<int, 123>::value); 
} 

Si rifiuta di compilare sotto Clang 3.3 e GCC 4.8.1 ("undefined reference to Foo<int, 123>::value"), che mi lascia perplesso perché Foo fa esattamente lo stesso di std::integral_constant e lo stesso codice funziona perfettamente con integral_constant. Inoltre, fallisce con un semplice riferimento di lvalue nella funzione di stampa. Qualche spiegazione riguardo questo comportamento?

Il problema è presente con questo abbastanza minimale esempio anche:

template<class T> 
struct Bar{ 
    static const bool value = true; 
}; 
+3

L'esempio viene compilato e eseguito [su Ideone] (http://ideone.com/BJLEuL). Forse un problema con il compilatore? – djf

+0

Ho modificato nelle versioni del compilatore; Ideone probabilmente usa cose più vecchie. –

+0

Ora questo è abbastanza interessante: http://www.compileonline.com lancia l'errore ma ha gcc 4.7.2 proprio come Ideone. –

risposta

4

Come il compilatore dice, non v'è alcun riferimento alla variabile statica, è necessario aggiungere

template<class T, T val> 
constexpr T Foo<T, val>::value; 

dopo la definizione di la classe Foo

+0

Grazie, questa sembra essere una soluzione abbastanza carina. –