2011-09-16 12 views
6

मैं सी ++ नाम-डिमैंगलिंग कोड के लिए कुछ परीक्षण केस लिख रहा हूं, और जब मैं इसे संकलित करने का प्रयास करता हूं तो मुझे एक अजीब त्रुटि मिलती है: (निम्नलिखित रोगजनक रूप से खराब सी ++ कोड है जिसे मैं अभ्यास में कभी भी उपयोग नहीं करता)।सी ++ टेम्पलेट प्रश्न

"typetest.cpp", line 165: error: nontype "Oog<T, U>::Huh<F>::Wham [with F=T]" 
    is not a template 

कोई भी विचार मैं कैसे ठीक कर सकते हैं: इस प्रकार

template<class U, class V> 
class TStruct 
{ 
    U u; 
    V v; 
public: 
    void setU(const U& newu) {u = newu; } 
}; 

template<class T, class U> 
class Oog 
{ 
    T t; 
    U u; 

public: 
    Oog(const T& _t, const U& _u) : t(_t), u(_u) {} 
    void doit(TStruct<T,U> ts1, TStruct<U,T> ts2, U u1, T t1) {} 

    template<class F> 
    class Huh 
    { 
     F f; 
    public: 

     template<class V> 
     class Wham 
     { 
      V v; 
     public: 
      Wham(const V& _v) : v(_v) {} 
      void joy(TStruct<T,V> ts1, U u, F f) {} 
     }; 
    }; 
    int chakka(const Huh<T>::Wham<U>& wu, T t) {} // error here 
}; 

त्रुटि है?

उत्तर

7

सही लाइन के रूप में होना चाहिए,

int chakka(const typename Huh<T>::template Wham<U>& wu, T t) ... 
    it's a type ^^^^^^^^   ^^^^^^^^ indicate that 'Wham' is a template 

[नोट: g++ is quite helpful in this case :)]

+1

धन्यवाद! मुझे 'टाइपनाम' के बारे में पता था, लेकिन मुझे नहीं पता था कि आपको उस तरह से 'टेम्पलेट' कीवर्ड का उपयोग करना था। –

+0

+1: एक और अच्छा जवाब! यह इस सप्ताह कम से कम दो बार है! : डी –

+0

@ टोमालक, आप 'अच्छा उत्तर' टिप्पणी देते हैं और फिर किसी के ऑब्जेक्ट के बाद आप अपना वोट/टिप्पणी वापस लेते हैं !! – iammilind

2

आप इसे बताने के लिए कि हुह की वैम सदस्य एक टेम्पलेट हो जाएगा की जरूरत है:

const Huh<T>::template Wham<U> & 
+1

आप अभी भी 'टाइपनाम' खो रहे हैं (कम से कम [gcc शिकायतें] (http://www.ideone.com/jjasO))। – iammilind

+1

@iammilind हां, जो मेरे साथ नहीं हुआ था। इससे पहले कि मुझे यकीन था कि इसकी आवश्यकता थी, थोड़ी देर के लिए आपके उत्तर पर नजर डालना पड़ा। –

-1

यह पर्याप्त होना चाहिए (आश्रित प्रकार परेशानी का कारण बनता है)

int chakka(const typename Huh<T>::Wham<U>& wu, T t) {}

+0

यह नहीं है। हालांकि, वहाँ हो रही है! (आपको इसे पोस्ट करने से पहले अपना जवाब आज़माएं) –

+0

एचएम .. असल में मैंने कोशिश की। मुझे लगता है कि केवल वीएस 2010 की तुलना में 'टेम्पलेट' कीवर्ड की आवश्यकता नहीं है। – Werolik

+1

कृपया अगली डाउनवॉटिंग से पहले वीएस 2010 में इसे आजमाएं। – Werolik

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