2012-10-11 31 views
6

के साथ ऑटो + स्थैतिक इन-क्लास निरंतर इनइलाइलाइजेशन निम्नलिखित सरलीकृत टेम्पलेट मेटा-प्रोग्रामिंग कोड पर विचार करें जो Angle कक्षा लागू करता है जो आंतरिक रूप से मॉड्यूल 360 डिग्री कम मूल्य को संग्रहीत करता है।मेटा-प्रोग्रामिंग

#include <iostream> 
#include <typeinfo> 

template<int N, int D> 
struct Modulus 
{ 
     static auto const value = N % D; 
}; 

template<int N> 
struct Angle 
{ 
     static auto const value = Modulus<N, 360>::value; // ERROR 
     //static int const value = Modulus<N, 360>::value; // OK 
     //static auto const value = N % 360;    // OK 

     typedef Angle<value> type; 
}; 

int main() 
{ 
     std::cout << typeid(Angle<30>::type).name() << "\n"; 
     std::cout << typeid(Angle<390>::type).name() << "\n"; 

     return 0; 
} 

आउटपुट Ideone

Visual C++ 2010 एक्सप्रेस के साथ

पर, मैं static auto const = Modulus<N, 360>::value कर सकते हैं, लेकिन MinGW जीसीसी 4.7.2 (Nuwen distro) या Ideone (जीसीसी 4.5.1) के साथ मैं या तो स्पष्ट निरूपित करने के लिए है static int const value = Modulus<N, 360>::value के रूप में टाइप करें या मुझे auto का उपयोग पूर्ण मॉड्यूलर अभिव्यक्ति के साथ static auto const value = N % 360; के रूप में करना होगा।

प्रश्न: कौन सा कंपाइलर नए सी ++ 11 मानक के अनुरूप सही है?

+0

हां, जीसीसी 4.5.1 में सी ++ 11 के लिए समर्थन अभी भी अधूरा है, आपको यह देखने के लिए http://gcc.gnu.org/projects/cxx0x.html की जांच करनी चाहिए कि कौन सी फीचर्स उपलब्ध हैं। –

+0

@ एचवीडी, गलत। उनको कॉन्स्टेक्स घोषित किया जाना चाहिए। –

+0

@ सेगफॉल्ट मुझे इन त्रुटियों को MinGW 4.7 – TemplateRex

उत्तर

1

कोड मान्य है। विज़ुअल सी ++ इसे स्वीकार करने का अधिकार है और जीसीसी इसे अस्वीकार करने में गलत है (पूर्णता के लिए, क्लैंग 3.1 कोड भी स्वीकार करता है)। विनिर्देश कहा गया है कि (सी ++ 11 7.1.6.4 [dcl.spec.auto]/4):

autoप्रकार-विनिर्देशक भी इस्तेमाल किया जा सकता ... के साथ एक स्थिर डेटा सदस्य घोषित करने में एक ब्रेस-या-बराबर-प्रारंभकर्ता जो कक्षा परिभाषा के सदस्य-विनिर्देश के भीतर प्रकट होता है।

आपका value एक स्थिर डेटा सदस्य है। इसमें ब्रेस-या-बराबर-प्रारंभकर्ता (यह = Modulus<N, 360>::value घोषणा का हिस्सा है), और प्रारंभकर्ता सदस्य-विनिर्देश वर्ग परिभाषा के भीतर प्रकट होता है (यानी, यह है कि प्राणियों को "इनलाइन प्रारंभकर्ता" ")।

+0

+1 और स्वीकार किया गया। आपका बहुत बहुत धन्यवाद! बग रिपोर्ट दर्ज करने का सबसे उचित तरीका क्या है? – TemplateRex

+0

@rhalbersma: जीसीसी में [एक बगजिला डेटाबेस] है (http://gcc.gnu.org/bugzilla/)। हालांकि, मैं उनकी बग रिपोर्टिंग प्रक्रियाओं से परिचित नहीं हूं। मैं यह देखने के लिए पहले खोज करूँगा कि यह पहले ही रिपोर्ट हो चुका है या नहीं। –