2013-02-06 16 views
6

इस कोड unexplicably संकलन नहीं करता है:सी ++ टेम्प्लेटेड प्रकार struct के साथ समारोह टेम्पलेट तर्क संकट

struct sometype 
{ 
    template <typename T> 
    T* get() { return nullptr; } 
}; 

template <typename T> 
struct anothertype 
{ 
#if 1 
    template <typename T2> struct some_wrapper { typedef T2 type; }; 
    typedef typename some_wrapper<sometype>::type thetype; 
#else 
    typedef sometype thetype; 
#endif 
    typedef thetype* Ptr; 

    Ptr m_ptr; 
    T* get() { return m_ptr->get<T>(); } 
}; 

तो मैं 0 करने के #if तर्क बदलने के लिए, यह किसी भी तरह तय हो गई है। क्या कोई इस में कुछ प्रकाश डाल सकता है? कृपया ध्यान दें कि स्पष्ट रूप से व्यर्थ some_wrapper चीज वास्तव में मेरे असली कोड में कुछ उपयोगी है।

मैं जी ++ 4.7.1 का उपयोग कर रहा -fstd=gnu++11 साथ, त्रुटि के रूप में निम्नानुसार (लाइन मैं कहाँ घोषित anothertype<T>::get की ओर इशारा करते है:

error: expected primary-expression before '>' token 
error: expected primary-expression before ')' token 
+0

यदि आप अपने कंपाइलर के माध्यम से पोस्ट किए गए कोड को ठीक से चलाते हैं, तो क्या आपको वह त्रुटि मिलती है? –

+0

@ डेविडरोड्रिगुएज़-ड्राईबीस http://ideone.com/N8dQoj (वास्तव में प्रश्न से कोड) – leemes

उत्तर

6

आप इस प्रकार अपने कार्य कॉल ठीक करना चाहिए, template कीवर्ड जोड़ने:

T* get() { return m_ptr->template get<T>(); } 

सिंटैक्स की व्याख्या के लिए आप this link देख सकते हैं।

8

यह आपके सभी typedefs साथ बताने के लिए कठिन है, लेकिन मैं था दांव आप की जरूरत:

m_ptr->template get<T>(); 
+0

+1 पहले होने के लिए। –

+0

लेकिन ... क्यों? 'm_ptr' * हमेशा *' sometype * 'है। – ipc

+1

@ipc उसके पास '#if 1' है जो सत्य होगा, इसलिए 'm_ptr'' टाइपनाम कुछ_वापर :: प्रकार *', एक आश्रित प्रकार –

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