2012-02-28 13 views
10

मैं XmlWriter कक्षा पर काम कर रहा हूं, और मैं अधिकांश मानक डेटा स्वरूपों (तार, पूर्णांक, फ़्लोटिंग पॉइंट नंबर इत्यादि) में विशेषताओं या पाठ को आउटपुट करने में सक्षम होना चाहता था। इसे प्राप्त करने के लिए, मैं एक फ़ाइल स्ट्रीम का उपयोग कर रहा हूँ।मैं सी ++ कक्षाओं में टेम्पलेट विशेषज्ञता का उपयोग कैसे कर सकता हूं, और यह संकलित क्यों नहीं करता है?

bool डेटा प्रकार के लिए, मैं इतना है कि यह true और false बजाय 1 और 0 आउटपुट, टेम्पलेट के लिए एक विशेषज्ञता निर्दिष्ट करने के लिए करना चाहता था।

हालांकि, निम्नलिखित कोड को संकलित करने के प्रतीत नहीं होता:

class XmlWriter { 

private: /* ... */ 

public: /* ... */ 

    template <typename T> 
    void writeText(T text) { 
     /* ... */ 
    } 

    template <> // <-- error: explicit specialization in non-namespace scope 'class Strategy::IO::XmlWriter' 
    void writeText<bool> (bool text) { // <-- error: template-id 'writeText<>' in declaration of primary template 
     /* ... */ 
    } 

    template <typename T> 
    void writeAttribute(std::string key, T value) { // <-- error: too many template-parameter-lists 
     /* ... */ 
    } 

    template <> // <-- error: explicit specialization in non-namespace scope 'class Strategy::IO::XmlWriter' 
    void writeAttribute<bool> (std::string key, bool value) { // <-- error: variable or field 'writeAttribute' declared void; expected ';' before '<' token 
     /* ... */ 
    } 
}; // <-- expected ';' before '}' token 

मुझे समझ नहीं आता, क्यों इन सभी त्रुटियों, के बाद से मैं इंटरनेट पर विभिन्न वेबसाइटों पर प्रस्तुत सही सिंटैक्स का इस्तेमाल किया?

मैं सिग्विन जीसीसी का उपयोग कर रहा हूं।

+1

यह VC2010 पर ठीक संकलित। विशेषज्ञता प्रदान करने के बजाय आप केवल कार्यों को अधिभारित कर सकते हैं: 'शून्य लेखन टेक्स्ट (बूल टेक्स्ट); '। – hmjd

+0

ठीक है, afaik VC2010 बहुत मानक अनुपालन नहीं है ... कोड जीसीसी में संकलित नहीं है। – Tibi

+0

जीसीसी का कौन सा संस्करण? – hmjd

उत्तर

12

explicit specialization in non-namespace scope 'class Strategy::IO::XmlWriter'

विशेषज्ञता को नामस्थान क्षेत्र में स्थानांतरित करने का प्रयास करें?

class XmlWriter { 

private: /* ... */ 

public: /* ... */ 

    template <typename T> 
    void writeText(T text) { 
    } 


    template <typename T> 
    void writeAttribute(std::string key, T value) { 
    } 


}; 

template <> 
void XmlWriter::writeText<bool> (bool text) { 
} 

template <> 
void XmlWriter::writeAttribute<bool> (std::string key, bool value) { 
} 
+1

यह संकलन प्रतीत नहीं होता है, यह मुझे त्रुटियां देता है कि इसे पहले ही परिभाषित किया गया है। मुझे यकीन नहीं है कि इसे एकाधिक फ़ाइल प्रोजेक्ट में सही तरीके से परिभाषित करने के लिए, मैंने कई संयोजनों की कोशिश की और कोई भी काम नहीं कर रहा है। – Tibi

+0

[मेरे लिए काम करता है] (http://ideone.com/qxXva) जी ++ 4.3.4 –

+0

के साथ^टिप्पणी – Tibi

2

शायद यह सिर्फ अपने सरल उदाहरण कोड की वजह से है, लेकिन आप वास्तव में इस समस्या के लिए टेम्पलेट विशेषज्ञता का उपयोग करने की जरूरत नहीं है। फ़ंक्शन ओवरलोडिंग को नौकरी ठीक करना चाहिए।

class XmlWriter 
{ 
public: 
    template <typename T> 
    void writeText(T text) { 
     std::cout << "Text: " << text; 
    } 

    void writeText (bool text) { 
     std::cout << "Bool: " << text; 
    } 
}; 
+1

+1: मुझे आपके उत्तर से बेहतर जवाब पसंद है। –

6

इसके बजाय विशेषज्ञता तुम सिर्फ writeText() और writeAttribute() ओवरलोड कर सकते हैं:: तो आप अपने कोड एक छोटे से इस तरह फिर से लिख सकता है

class XmlWriter { 

private: /* ... */ 

public: /* ... */ 

    template <typename T> 
    void writeText(T text) {} 

    void writeText(bool text) {} 

    template <typename T> 
    void writeAttribute(std::string key, T value) {} 

    void writeAttribute(std::string key, bool value) {} 
}; 

जी ++ v4.6.1 के साथ संकलित।

0

विशेष घोषणा निकालें और परिभाषा यह इनलाइन बनाने:

class XmlWriter { 

private: /* ... */ 

public: /* ... */ 

    template <typename T> 
    void writeText(T text) { 
    } 


    template <typename T> 
    void writeAttribute(std::string key, T value) { 
    } 


}; 

template <> 
inline void XmlWriter::writeText<bool> (bool text) { 
} 

template <> 
inline void XmlWriter::writeAttribute<bool> (std::string key, bool value) { 
} 
संबंधित मुद्दे