2013-01-15 32 views
13

नहीं मिला निम्न कोड के लिएस्थिर constexpr सदस्य समारोह

#include <array> 

template<unsigned MaxP, typename type> 
struct kernel 
{ 
    static constexpr unsigned max_pole(unsigned P) 
    { return P>MaxP? MaxP:P; } 

    template<unsigned P> 
    using array = std::array<type,max_pole(P)>;   // wrong? 

    template<unsigned P> 
    static void do_something(array<P> const&, array<P>&); 
}; 

जीसीसी 4.7.0 (छ ++ -c -std = C++ 11) देता है

error: ‘max_pole’ was not declared in this scope 

इस है सही (कंपाइलर का व्यवहार)? ध्यान दें कि यदि मैं संकेतित लाइन पर kernel::max_pole के साथ max_pole को हल करके हल करता हूं, तो यह ठीक से संकलित करता है।

संपादित बगजिला की रिपोर्ट की गई, बग C++/55992 के रूप में स्वीकार कर लिया, http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55992 देखते हैं। जीसीसी 4.7.एक्स और 4.8.0 के साथ भी होता है।

+0

बस परीक्षण किया गया: 'g ++ 4.7.2' के लिए किसी के पास एक नया संस्करण 4.8 है? शायद यह एक बग है जो तय किया गया था ... – leemes

उत्तर

9

आपका टेम्पलेट क्लैंग 3.2 के साथ ठीक से संकलित करता है। मुझे दृढ़ विश्वास है कि यह एक जीसीसी बग है (जो जीसीसी 4.7.2 में भी मौजूद है, बीटीडब्ल्यू)। जीसीसी 4.8.0 के लिए नोट्स बदलें ऐसे किसी भी बगफिक्स का उल्लेख नहीं करते हैं।

यह भी ध्यान दें कि अगर आप do_something<> की घोषणा को हटाते हैं तो संकलन त्रुटि गायब हो जाती है, जिससे कोई फर्क नहीं पड़ता।

एक और संकेत: इस टेम्पलेट नहीं जीसीसी 4.7.2 पर संकलन करता है, जबकि:

template<unsigned MaxP, typename type> 
struct kernel 
{ 
    static constexpr unsigned max_pole(unsigned P) 
    { return P>MaxP? MaxP:P; } 

    template<typename T> 
    using array2 = int[max_pole(3)]; // ERROR! 

    static void do_something(array2<int> const&, array2<int>&); 
}; 

इस टेम्पलेट करता संकलन:

template<unsigned MaxP, typename type> 
struct kernel 
{ 
    static constexpr unsigned max_pole(unsigned P) 
    { return P>MaxP? MaxP:P; } 

    // template<typename T> <--- removed 
    using array2 = int[max_pole(3)]; // OK 

    static void do_something(array2 const&, array2&); 
}; 

max_pole के बाद से दोनों ही मामलों में है एक अयोग्य स्वतंत्र नाम, लुकअप रणनीति शोल डी दोनों मामलों में समान हो, और यह नहीं है। मेरे लिए, यह इसे एक बग के रूप में योग्य बनाता है।

+0

तो, आपके शोध के अनुसार, यह स्थिति विशेष रूप से होती है जब आप कुछ परिस्थितियों में दो नई सी ++ 11 विशेषताओं ('constexpr' + उपनाम टेम्पलेट्स) को मिलाते हैं। एक कंपाइलर बग के लिए सही परिदृश्य। – Gorpik

+0

@Gorpik: हाँ, मुझे एक ही भावना है –

+1

+1 धन्यवाद। मुझे एक ही भावना थी। बगजिला में सूचना दी। – Walter