2009-08-21 16 views
5

मैं कुछ परेशानी लिनक्स पर संकलित करने के लिए इस कोड को हो रही हो रही है, लेकिन यह Windows में पूरी तरह से काम करता है में टेम्पलेट समस्या।C++ पार मंच कोड

विंडोज संकलक: विजुअल स्टूडियो 2005

लिनक्स संकलक: जीसीसी संस्करण 3.4.3 20,041,212 (रेड हैट 3.4.3-9.EL4)

class DoSomething 
{ 
    public: 
    template <class DataType> 
    bool Execute() 
    { 
     //do something here 
    } 
}; 


template <class Operator> 
TypeSwitch(int DataTypeCode, Operator& Op) 
{ 
    switch (DataTypeCode) 
    { 
    case 1: return Op.Execute<char>(); 
    case 2: return Op.Execute<int>(); 
    //snip; 
    } 
} 

//To call the operator 
TypeSwitch(Code,DoSomething); 

Windows में इस कोड को पूरी तरह से काम करता है और वास्तव में करता है मैं इसे क्या चाहता हूँ।

त्रुटि: उम्मीद से पहले प्राथमिक अभिव्यक्ति ')' टोकन

मामले के साथ पंक्तियों में से प्रत्येक के लिए: उम्मीद से पहले '>' टोकन

त्रुटि प्राथमिक अभिव्यक्ति लिनक्स में, मैं त्रुटियों मिल बयान।

कोई विचार?

धन्यवाद, माइक

+0

कौन सा लाइनों त्रुटियों द्वारा इंगित किया जाता है? – Klaim

+0

वह अपने पद में कहते हैं: "केस स्टेटमेंट के साथ प्रत्येक पंक्ति के लिए।" – DeusAduro

+0

क्या आप सुनिश्चित करते हैं कि कोड संकलित करता है? मैं कई त्रुटियों को देख सकता हूं। टाइपस्विच रिटर्न टाइप कहां है? –

उत्तर

13

समस्या यह है कि जब संकलक Op.Execute<char>(); का सामना करना पड़ता है और यह पार्स करने के लिए कोशिश करता है, यह भ्रमित हो जाता है। इसलिए संकलक अपने सदस्यों के बारे में ज्यादा पता नहीं है

Op, एक आश्रित नाम है। तो यह नहीं जानता कि Execute एक टेम्पलेट फ़ंक्शन है। इसके बजाए, यह मानता है कि < का अर्थ है उससे कम। आप कुछ और करने के लिए किसी अज्ञात Execute सदस्य तुलना करने के लिए कोशिश कर रहे हैं यही कारण है कि।

बजाय, रेखा इस तरह दिखना चाहिए:

case 1: return Op.template Execute<char>(); 

अब संकलक जानता है कि Execute एक टेम्पलेट है, इसलिए जब यह मुठभेड़ों < यह नहीं "से कम" है, लेकिन टेम्प्लेट के आरंभ मापदंडों।

समस्या कैसे आप typename जरूरत है जब एक आश्रित नाम से संबंधित प्रकार का उल्लेख के समान है। आप किसी टेम्पलेट सदस्य समारोह की चर्चा करते हुए कर रहे हैं, और टेम्पलेट तर्क को स्पष्ट रूप से दिया जाता है, तो आप template कीवर्ड की जरूरत है।

जीसीसी के व्यवहार सही है, और MSVC भी उदार है। आप template कीवर्ड जोड़ते हैं, अपने कोड दोनों compilers में काम करते हैं (और सही हो मानक के अनुसार) होगा

+2

सी ++ टेम्पलेट पार्सिंग नियमों की अद्भुत, जादुई दुनिया में आपका स्वागत है! –

+0

आह, धन्यवाद! सोमवार की सुबह काम करने के लिए मैं वापस आऊंगा, लेकिन आपका विवरण ठीक लगता है। बस टेम्पलेट्स के साथ subtleties प्यार करता हूँ! – miked

+0

किसी और के लिए बस एक फॉलो अप करें जिसकी आवश्यकता है: मैंने बस यह पाया कि एमएसवीसी में एक ज्ञात बग है कि उपरोक्त फिक्स काम नहीं करता है। तो विंडोज़ में आपको Op.Execute () की आवश्यकता नहीं है और आपको विंडोज़ की आवश्यकता नहीं है। OPTemplate () निष्पादित करें। – miked

1
case 1: return Op.template Execute<char>(); 
case 2: return Op.template Execute<int>(); 

देखें: template as qualifier

इसके अलावा, TypeSwitch() एक bool रिटर्न

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