2013-06-30 7 views
11
के साथ एक जिज्ञासु मामले

कोड का निम्न भाग लें:संदर्भ और स्थिर वर्ग के सदस्यों

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

यह बजना 3.3 और जीसीसी 4.8.1 ("undefined reference to Foo<int, 123>::value") है, जो मुझे पहेली क्योंकि Foo बिल्कुल के रूप में एक ही करता है के तहत संकलित करने के लिए मना कर दिया std::integral_constant, और एक ही कोड integral_constant के साथ ठीक चलाता है। यह प्रिंट फ़ंक्शन में सादे lvalue संदर्भ के साथ भी विफल रहता है। इस व्यवहार के बारे में कोई स्पष्टीकरण?

मुद्दा भी इस काफी कम उदाहरण के साथ मौजूद है: संकलक का कहना है

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

आपका उदाहरण संकलित करता है और [आइडिया पर] चलाता है (http://ideone.com/BJLEuL)। शायद एक संकलक मुद्दा? – djf

+0

मैंने कंपाइलर संस्करणों में संपादित किया; विचार शायद पुरानी चीजें का उपयोग करता है। –

+0

अब यह काफी रोचक है: http://www.compileonline.com त्रुटि फेंकता है लेकिन जीसीसी 4.7.2 सिर्फ आइडिया जैसा है। –

उत्तर

4

हैं, वहाँ स्थिर चर के लिए कोई संदर्भ है, तो आप की परिभाषा के बाद

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

जोड़ना होगा कक्षा Foo

+0

धन्यवाद, यह एक अच्छा पर्याप्त समाधान प्रतीत होता है। –

संबंधित मुद्दे