2010-07-18 18 views
10

निम्नलिखित वर्ग पर विचार करें:निर्भर गैर प्रकार खाका पैरामीटर

class Foo 
{ 
    enum Flags {Bar, Baz, Bax}; 

    template<Flags, class = void> struct Internal; 

    template<class unused> struct Internal<Bar, unused> {/* ... */}; 
    template<class unused> struct Internal<Baz, unused> {/* ... */}; 
    template<class unused> struct Internal<Bax, unused> {/* ... */}; 
}; 

compiles और कार्यों जब कुलपति ++ 2010 और Comeau सी ++ पर परीक्षण की उम्मीद के रूप में ऊपर वर्ग रूपरेखा। हालांकि, जब Foo एक टेम्पलेट में ही किया जाता है, कुलपति ++ 2010

उदाहरण के लिए, निम्नलिखित स्निपेट के तहत ऊपर टुकड़ा टूट जाता है:

template<class> class Foo 
{ 
    // Same contents as the original non-templated Foo. 
}; 

पैदावार निम्नलिखित error class:

C2754: 'Foo<<unnamed-symbol>>::Internal<Bar,unused>' : a partial specialization cannot have a dependent non-type template parameter 
C2754: 'Foo<<unnamed-symbol>>::Internal<Baz,unused>' : a partial specialization cannot have a dependent non-type template parameter 
C2754: 'Foo<<unnamed-symbol>>::Internal<Bax,unused>' : a partial specialization cannot have a dependent non-type template parameter 

  1. क्या कोई समझा सकता है कि सादे अंग्रेजी में क्या हो रहा है?
  2. मैं इसे कैसे ठीक कर सकता हूं (यानी, वीसी ++ 2010 पर एक टेम्पलेट Foo में आंतरिक छद्म-स्पष्ट विशेषज्ञता रखें?
+1

मैं कहूंगा कि त्रुटि संदेश फर्जी है। FWIW, Comau कोड स्वीकार करता है भले ही 'Foo' एक टेम्पलेट है। मेरा सुझाव है कि आप एमएस के न्यूज़ ग्रुप में से किसी एक में आज़माएं। एमएस कंपाइलर लोग वहां लटकते थे। – sbi

उत्तर

4

मैं कैसे ठीक कर सकते हैं इस कुलपति ++ 2010 को (यानी, किसी टेम्प्लेट की गई फू में आंतरिक छद्म स्पष्ट विशेषज्ञताओं रखने के लिए)?

आप गणना प्रकार गैर निर्भर एक गैर टेम्पलेट आधार वर्ग में यह घोषणा करके (सी ++ 03 #108 में नेस्टेड कक्षाएं निर्भर बना दिया लेकिन कहा कि गणना में शामिल नहीं है, लेकिन भले ही, इस तरह के कोड बना सकते हैं अभी भी कानूनी होगा)।

struct FooBase { 
    enum Flags {Bar, Baz, Bax}; 
}; 

template<class> class Foo : public FooBase { 
    template< ::FooBase::Flags, class = void > struct Internal; 
    // same other stuff ... 
}; 

"त्रुटि वर्ग" लिंक पहले से ही इच्छित मामलों का विवरण देता है जहां त्रुटि उत्पन्न की जानी चाहिए। त्रुटि का मानना ​​है कि सभी निर्भर प्रकार वर्जित किया गया है, लेकिन वास्तव में इस मानक क्या कहते है:

टेम्पलेट पैरामीटर एक विशेष गैर प्रकार तर्क करने के लिए इसी प्रकार के विशेषज्ञता के एक पैरामीटर पर निर्भर नहीं होगा ।

इसलिए भले ही नाम Flags किसी भी तरह निर्भर हो सकता है, कि यह बीमार का गठन जब तक कि वह अपने "त्रुटि वर्ग" के उदाहरण की तरह विशेषज्ञता के एक पैरामीटर पर निर्भर नहीं करता के रूप में नहीं होगा संपर्क।

+3

काफी परेशान है कि माइक्रोसॉफ्ट अपने सभी जनशक्ति पर विचार करने वाले अनुरूप कंपाइलर का उत्पादन नहीं कर सकता है। विशेष रूप से जब आप गैर-मुक्त संस्करणों के लिए पूछताछ मूल्य खाते में लेते हैं। – rybz

+0

@litb: मुझे यकीन नहीं है कि मैं अनुसरण करता हूं: विशेषज्ञता के पैरामीटर पर 'ध्वज' निर्भर कैसे है? – HighCommander4

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