2012-02-02 21 views
10

मैं कुछ बच्चे वर्गों के लिए कुछ सामान्य कार्यक्षमता प्रदान करने के लिए एक टेम्पलेट कक्षा का उपयोग करना चाहता हूं जो बहुत समान हैं। एकमात्र भिन्नता यह है कि प्रत्येक का उपयोग किया जाता है।एक टेम्पलेट पैरामीटर के रूप में एक गणना का उपयोग

:

यह माता पिता के वर्ग

template<typename T> class E_EnumerationBase : public SimpleElement 
{ 
public: 
    E_EnumerationBase(); 
    virtual bool setValue(QString choice); 
    virtual T getState(); 

protected: 
    T state; 
    QHash<QString, T> dictionary; 
}; 

template<typename T> E_EnumerationBase<T>::E_EnumerationBase() { 
    state = 0; 
} 

template<typename T> bool E_EnumerationBase<T>::setValue(QString choice) { 
    T temp; 
    temp = dictionary.value(choice, 0); 
    if (temp == 0) { 
     return false; 
    } 

    value = choice; 
    state = temp; 
    return true; 
} 

template<typename T> T E_EnumerationBase<T>::getState() { 
    return state; 
} 

यह बच्चों में से एक है

enum TableEventEnum { 
    NO_VALUE = 0, 
    ATTRACT = 1, 
    OPEN = 2, 
    CLOSED = 3 
}; 

class E_TableEvent : public E_EnumerationBase<enum TableEventEnum> 
{ 
public: 
    E_TableEvent(); 
}; 

यह निर्माता

E_TableEvent::E_TableEvent() 
{ 
    state = NO_VALUE; 
    dictionary.insert("attract", ATTRACT); 
    dictionary.insert("open", OPEN); 
    dictionary.insert("closed", CLOSED); 
} 

लिंकर इस त्रुटि फेंक रहा है है

e_tableevent.cpp:6: error: undefined reference to `E_EnumerationBase<TableEventEnum>::E_EnumerationBase()' 

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

+4

"* संकलक इस त्रुटि को फेंक रहा है: *" नहीं, _linker_ उस त्रुटि को फेंक रहा है। – ildjarn

+0

हैडर फ़ाइल में आपकी कन्स्ट्रक्टर परिभाषा है? – Lol4t0

+0

नहीं, परिभाषा एक अलग स्रोत फ़ाइल में है। त्रुटि लिंक पर दिखाई देती है। – IslandCow

उत्तर

18

Enumerations ठीक उसी तरह है कि ints कर सकते हैं में टेम्प्लेट पैरामीटर हो सकता है।

enum Enum { ALPHA, BETA }; 

template <Enum E> class Foo { 
    // ... 
}; 

template <> void Foo <ALPHA> :: foo() { 
    // specialise 
} 

class Bar : public Foo <BETA> { 
    // OK 
} 

लेकिन आप बस के लिए E_EnumerationBase::E_EnumerationBase()

यह एक परिभाषा प्रदान नहीं किया है टेम्पलेट्स या inheritence के साथ एक समस्या नहीं है। यह वही है के रूप में यदि आप इस प्रश्न के लिखित:

struct Foo { 
    Foo(); 
} 
int main() { 
    Foo foo; 
} 
+0

मेरा बुरा। कन्स्ट्रक्टर और विधियों के कार्यान्वयन शामिल। – IslandCow

+0

क्या आप इसे [ideone.com] (http://www.ideone.com) पर पोस्ट कर सकते हैं या ऐसे फॉर्म में समान हैं कि यह एकमात्र त्रुटि है? लाइन नंबर आदि देखना उपयोगी होगा। अभी के लिए मुझे विश्वास नहीं है कि 'सार्वजनिक E_EnumerationBase ' बिल्कुल संकलित है। – spraff

+0

यह _is_ संकलित करता है। _ और लिंक_: http://ideone.com/Blaw9 – Lol4t0

7

वाक्य रचना मूल्य तर्क के लिए चला जाता है जैसे कि यह typename तर्क के लिए है। मूल रूप से, आप बस अपने enum के नाम के साथ typename बदल देते हैं: जब तक आप गंभीरता से टेम्पलेट्स को समझने

enum Foo { Bar, Frob }; 

template <Foo F> struct Boom {}; // primary template 
template <> struct Boom<Bar> {}; // specialization of whole class 

... 

template <> void Boom<Frob>::somefun() {} // specialization of single member 

गंभीर टेम्पलेट कोड लिखने है।


हालांकि, मेरा असली सिफारिश पहले टेम्पलेट्स पर एक अच्छा पढ़ा पाने के लिए किया जाएगा। आप पैसा खर्च कर सकते हैं, मेरा सुझाव है Josuttis/Vandevoorde के सी ++ टेम्पलेट: पूरी गाइड

+1

आप सुझाव देते हैं कि enum का उपयोग इसके मूल्य के लिए किया जा रहा है, न कि एक प्रकार के रूप में? मुख्य रूप से, मैं हैश तालिका में मानों को प्रतिबंधित करने की कोशिश कर रहा हूं। – IslandCow

0

आप अलग स्रोत फ़ाइल के लिए टेम्पलेट समारोह की परिभाषा नहीं ले जा सकते।

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

अलग-अलग फ़ाइल में आपका कोड संकलित नहीं किया गया है, यही कारण है कि आपके पास वास्तव में E_EnumerationBase<TableEventEnum>::E_EnumerationBase() के लिए कोई परिभाषा नहीं है। यही कारण है कि आप लिंकर त्रुटि प्राप्त करते हैं।

बस अपने शीर्षक के सभी टेम्पलेट कोड चलते हैं।

+0

* वहां [enum] को संकलित नहीं किया जाएगा "* - Enums don संकलित * प्रति * * प्राप्त नहीं है। वे कक्षा में कोई जगह नहीं लेते हैं। यह एक स्थिर int के विपरीत है, जिसके लिए एक परिभाषा की आवश्यकता होती है और आवंटन का कारण बनता है। – jww

0

बस संदर्भ के लिए, जैसा कि आप क्यूटी का उपयोग करते हैं: बस Q_ENUM, QMetaEnum और QMetaEnum::fromType पर एक नज़र डालें। ये आपके शब्दकोश को आरंभ करने के लिए आसान हो सकता है।

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

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