2010-05-25 14 views
7

मेरे पास एक क्लास फैक्ट्री है जहां मैं c'tor पैरामीटर (नीचे कोड) के लिए वैरैडिक टेम्पलेट्स का उपयोग कर रहा हूं। हालांकि, जब मैं इसका उपयोग करने का प्रयास करता हूं, तो मुझे संकलन त्रुटियां मिलती हैं; जब मैंने मूल रूप से पैरामीटर के बिना इसे लिखा, तो यह ठीक काम करता था।सी ++ 0x वर्ग फैक्ट्री वैरिएडिक टेम्पलेट्स समस्या

यहाँ वर्ग है:

template< class Base, typename KeyType, class... Args > 
class GenericFactory 
{ 
public: 
    GenericFactory(const GenericFactory&) = delete; 
    GenericFactory &operator=(const GenericFactory&) = delete; 

    typedef Base* (*FactFunType)(Args...); 

    template <class Derived> 
    static void Register(const KeyType &key, FactFunType fn) 
    { 
     FnList[key] = fn; 
    } 

    static Base* Create(const KeyType &key, Args... args) 
    { 
     auto iter = FnList.find(key); 
     if (iter == FnList.end()) 
     return 0; 
     else 
     return (iter->second)(args...); 
    } 

    static GenericFactory &Instance() { static GenericFactory gf; return gf; } 
private: 
    GenericFactory() = default; 

    typedef std::unordered_map<KeyType, FactFunType> FnMap; 
    static FnMap FnList; 
}; 

template <class B, class D, typename KeyType, class... Args> 
class RegisterClass 
{ 
public: 
    RegisterClass(const KeyType &key) 
    { 
     GenericFactory<B, KeyType, Args...>::Instance().Register(key, FactFn); 
    } 
    static B *FactFn(Args... args) 
    { 
     return new D(args...); 
    } 
}; 

यहाँ त्रुटि है: जब बुला (जैसे)

// Tucked out of the way 
RegisterClass<DataMap, PDColumnMap, int, void *> RC_CT_PD(0); 

जीसीसी 4.5.0 मुझे देता है:

In constructor 'RegisterClass<B, D, KeyType, Args>::RegisterClass(const KeyType&) [with B = DataMap, D = PDColumnMap, KeyType = int, Args = {void*}]': 
no matching function for call to 'GenericFactory<DataMap, int, void*>::Register(const int&, DataMap* (&)(void*))' 

मैं कर सकते हैं ' टी देखें कि यह क्यों संकलित नहीं होगा और व्यापक googling के बाद मुझे जवाब नहीं मिला। क्या कोई मुझे बता सकता है कि मैं क्या गलत कर रहा हूं (अजीब परिवर्तनीय नाम से अलग, जो संदर्भ में समझ में आता है)?

+0

ये कक्षाएं कैसे उपयोगी हैं? क्या आप एक सरल उदाहरण प्रदान कर सकते हैं कि यह संकलित होने पर उनका उपयोग कैसे किया जाएगा? –

+0

यह तब होता है जब आपको व्युत्पन्न कक्षा को तुरंत चालू करने की आवश्यकता होती है लेकिन आप केवल यह जानते हैं कि आपको रनटाइम पर किस कक्षा की आवश्यकता है। 'Args' पैरामीटर तब होता है जब कक्षा निर्माता के तर्क होते हैं। – user350096

+0

प्रश्न 'जेनेरिक फैक्ट्री' में शामिल कोड में एक टेम्पलेटेड क्लास भी नहीं है। मुझे लगता है कि आपको कोई मदद पाने के लिए इसे ठीक करना चाहिए। – doublep

उत्तर

2

मुझे लगता है कि इसे यहाँ barfing है:

template <class Derived> 
static void Register(const KeyType &key, FactFunType fn) 
{ 
    FnList[key] = fn; 
} 

आप इस समारोह में Derived का उपयोग नहीं करते, लेकिन यह शायद जीसीसी के GenericFactory<...>.Register(...) को हल करने का प्रयास अप खिलवाड़ कर रहा है। आप इसे GenericFactory<...>::Register(...) में बदलना भी चाहेंगे।

+0

धन्यवाद, यह काम किया। मुझे पता था कि यह कुछ आसान होना था! – user350096

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