2010-08-12 23 views
5

आधुनिक सी ++ डिजाइन निम्न उदाहरण देता है कुछ पागल रिकर्सन होने जा रहा है। यह कैसे संभव हो सकता है?टेम्पलेट का उपयोग करें टेम्पलेट वर्ग तर्क

संपादित करें:

मैं कोशिश की है Potatoswatter (खेद lol) टिप्पणी:

template <class SmartPtr> struct SingleThreadingModel 
{ 
    class Lock 
    { 
    public: 
     Lock(SmartPtr&) 
     { 
     } 
    }; 
}; 

लेकिन यह हमारा इस तरह से काम किया।

main.cpp:28:35: error: type/value mismatch at argument 1 in template parameter list for ‘template<class> class ThreadingModel’ 
main.cpp:28:35: error: expected a type, got ‘SmartPtr’ 
+0

आह, हाँ। टेम्पलेट टेम्पलेट पैरामीटर। सबसे भ्रमित चीजों में से एक कभी। –

+2

आपका नया कोड ठीक दिखता है। आपको क्या त्रुटि मिलती है, और कहां? इसके अलावा, एक टमाटरवाटर लगता है जैसे यह एक बड़ी गड़बड़ी करेगा, जिसे मैं करने से बचने की कोशिश करता हूं। – Potatoswatter

उत्तर

5

आप SmartPtr एक टेम्पलेट प्रकार ThreadingModel को तर्क के रूप में पारित करने के लिए कोशिश कर रहे हैं। SmartPtr हालांकि एक टेम्पलेट है, ठोस प्रकार नहीं है, और injected class-name विरासत सूची में उपलब्ध नहीं है।

भी ध्यान रखें कि आप सिर्फ डिफ़ॉल्ट तर्क मनमाने ढंग से स्थिति में टेम्पलेट मानकों (§14.1/11) के लिए उपयोग नहीं कर सकते:

एक टेम्पलेट पैरामीटर एक डिफ़ॉल्ट टेम्पलेट तर्क है, तो बाद के सभी, टेम्पलेट-पैरामीटर में एक डिफ़ॉल्ट टेम्पलेट-तर्क दिया जाएगा।

उन समस्याओं को ठीक कर के साथ आपका कोड:

template 
< 
    class T, 
    template <class> class ThreadingModel, 
    template <class> class CheckingPolicy = EnsureNotNull 
> 
class SmartPtr 
    : public CheckingPolicy<T> 
    , public ThreadingModel<SmartPtr<T, ThreadingModel, CheckingPolicy> > 
//      ^.... now passing a concrete class ....^
{ 
    T* operator->() { 
     // the following use of SmartPtr is fine as it is the injected class-name: 
     typename ThreadingModel<SmartPtr>::Lock guard(*this); 
     // ... 
    } 
}; 

ध्यान दें कि जब आधुनिक सी ++ डिजाइन एक उत्कृष्ट पुस्तक है, यह एक अच्छा बुनियादी किताब टेम्पलेट्स पर Vandevoorde/Josuttis तरह बदल नहीं सकते।

+0

समझ में आता है। मैंने लोकी से स्रोत कोड डाउनलोड किया है और देखा है कि थ्रेडिंग मॉडल कक्षा परिभाषा पर मौजूद नहीं है। – scooterman

0

प्रत्यावर्तन ठीक है क्योंकि टेम्पलेट पैरामीटर के रूप में एक विशेषज्ञता गुजर सीधे कारण नहीं है यह instantiated जा करने के लिए:

यहाँ त्रुटि है कि जीसीसी मुझे दे रहा है है।

(आधार सूची में ThreadingModel<SmartPtr> बस जो का उपयोग करता है ThreadingModel< SmartPtr< T, CheckingPolicy, ThreadingModel > > के लिए आशुलिपि है "वर्तमान विशेषज्ञता।")

पता नहीं क्या ThreadingModel करने के लिए माना जाता है, इसलिए मैं इसे लागू नहीं किया जा सकता है, लेकिन यह प्रपत्र

template< class Client > class MyThreading 

की घोषणा होनी चाहिए और यह MyThreading सदस्य कार्यों के Client बाहर के अंदर कुछ भी उपयोग नहीं कर सकते। यदि आप Client और Client का उपयोग MyThreading पर निर्भर करते हैं, तो अनंत रिकर्सन होता है।

+0

आलू, क्या आप प्रदान कर सकते हैं कि थ्रेडिंगमोडेल की घोषणा कैसे लागू की जा सकती है? मैंने यहां कई तरीकों की कोशिश की है और कोई भी काम नहीं किया है। – scooterman

+0

हम्म, कोशिश की कि। यह क्लाइंट इनसाइट क्लास का उपयोग करके या नहीं उपयोग किया गया था।ध्यान दें कि उदाहरण पर यह पैरामीटर को पैरामीटर के रूप में पास करने वाला एक गार्ड बनाता है, इसलिए इसे काम करना चाहिए। – scooterman

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