2009-03-25 13 views
8

मैं C++/CLI और पूर्णांक आदिम के लिए एक स्पष्ट टेम्पलेट इन्स्टेन्शियशन में निम्नलिखित वर्ग ..उपयोग सी सी # में ++ CLI टेम्पलेट वर्ग

template<typename T> 
public ref class Number 
{ 
    T _value; 
public: 
    static property T MinValue 
    { 
     T get() 
     { 
      return T::MinValue; 
     } 
    } 

    static property T MaxValue 
    { 
     T get() 
     { 
      return T::MaxValue; 
     } 
    } 

    property T Value 
    { 
     T get() 
     { 
      return _value; 
     } 

     void set(T value) 
     { 
      if(value<MinValue || value > MaxValue) 
       throw gcnew System::ArgumentException("Value out of range"); 

      _value = value; 
     } 
    } 

}; 

template ref class Number<int>; 

इस संकलन और उत्पन्न परावर्तक विधानसभा का उपयोग कर निरीक्षण पर मैं कर रहा हूँ एक वर्ग Number<int> कहा जाता है को देखने के लिए, लेकिन सी # में यह एक ही कक्षा का दृष्टांत का प्रयास करते समय संकलक शिकायत System::Number के बारे में कुछ वर्ग एक टेम्पलेट तर्क नहीं ले रही। मैं क्या गलत कर रहा हूं? क्या यह बिल्कुल किया जा सकता है?

उत्तर

10

मेरे पास एक काम है, Number<int> कक्षा विरासत में एक अतिरिक्त वर्ग घोषित करें। यह कक्षा अब सी # में दिखाई दे रही है और इसे तुरंत चालू किया जा सकता है।

public ref class MyInt32 : public Number<int> 
{ 
}; 
1

अपने लक्ष्य सी ++ CLI में एक parametrized प्रकार बनाते हैं और फिर सी # से कि प्रकार का उपयोग करने के लिए है, तो मुझे लगता है कि आप एक टेम्पलेट प्रकार एक सामान्य प्रकार के बजाय (वजहों के लिए Stan Lippman's Blog देख बनाने की जरूरत दोनों विधियां मौजूद हैं)। सी ++ सीएलआई में सामान्य प्रकार बनाने के तरीके के बारे में जानकारी के लिए here देखें।

+0

दुख की बात है, सामान्य प्रकार के निर्माण के बाद से सी # C++/CLI का उपयोग कर एक ही कर सकते हैं का पूरा उद्देश्य धरा और समान रूप से अप्रभावी है। –

+0

तब यह लग रहा है इस सवाल का जवाब आप पोस्ट की तरह जाने के लिए (भले ही है कि कुछ हद तक टेम्पलेट्स का उपयोग करने के उद्देश्य से भी धरा) एक ही रास्ता है। जैसा कि @ जेरेडपायर ने कहा, टेम्पलेट जेनेरिक के समान नहीं हैं, और केवल सी ++ टेम्पलेट का उपयोग कर सकते हैं। – Andy

9

परावर्तक झूठ बोल रहा है। कक्षा का नाम वास्तव में संख्या <int> नहीं है। यह वास्तव में 'संख्या <int>' है। एकल उद्धरण पर ध्यान दें। ये केवल तभी दिखाई देते हैं जब आप ildasm के साथ प्रकार का नाम देखते हैं।

I मानते हैं यह अधिकांश भाषाओं में प्रकार को अविभाज्य बनाने के लिए किया जाता है क्योंकि उनके पास यह समझने का कोई तरीका नहीं है कि सी ++ टेम्पलेट वास्तव में कैसे काम करता है। यह प्रभावी रूप से केवल सी ++ संकलक जो उचित है, क्योंकि यह केवल एमएस संकलक है कि वास्तव में टेम्पलेट्स (टेम्पलेट्स! = जेनरिक) का समर्थन करता है है को दिखाई पड़ता है।

+0

और मुझे लगता है कि C++/CLI टेम्पलेट्स उन पर एक आवश्यक आपरिवर्तक के रूप में अच्छी तरह से है, ILDASM पता चलता है कि रूप में अच्छी तरह करना चाहिए। सीएलआई उन उपकरणों को प्रतिबंधित करता है जो सदस्य का उपयोग करने के लिए आवश्यक संशोधक को नहीं समझते हैं। –

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