2009-05-09 13 views
11

मैं लिनक्स पर निम्नलिखित कोड जीसीसी 4.2 का प्रयोग संकलित करने के लिए कोशिश कर रहा हूँ:प्रकार/टेम्पलेट सी क्लास घोषणा में ++ मूल्य बेमेल

#include <map> 
#include <list> 

template<typename T> 
class A 
{ 
... 

private: 
    std::map<const T, std::list<std::pair<T, long int> >::iterator> lookup_map_; 
    std::list<std::pair<T, long int> > order_list_; 

}; 

जब मैं इस वर्ग मैं जीसीसी से निम्न संदेश प्राप्त होता है संकलन:

error: type/value mismatch at argument 2 in template parameter list for ‘template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map’ 
error: expected a type, got ‘std::list<std::pair<const T, long int>,std::allocator<std::pair<const T, long int> > >::iterator’ 
error: template argument 4 is invalid 

मैं फ़ाइल नाम और लाइन नंबर को हटा दिया है, लेकिन वे सभी लाइन मानचित्र घोषित करने का संदर्भ लें।

जब मैं इन अभिव्यक्तियों में जोड़ी को एक int या कुछ ठोस प्रकार के साथ प्रतिस्थापित करता हूं, तो यह ठीक से संकलित होता है। क्या कोई मुझे बता सकता है कि मैं क्या गलत कर रहा हूं।

उत्तर

21

आप typenamestd::list<...>::iterator से पहले लिखने के लिए है, क्योंकि iterator एक नेस्टेड प्रकार है और आप किसी टेम्पलेट लिख रहे हैं की जरूरत है।

संपादित करें: typename बिना, जीसीसी मान लिया गया है (के रूप में मानक की आवश्यकता है) कि iterator वास्तव में, list में एक स्थिर चर रहा है बल्कि एक प्रकार की तुलना में। इसलिए "पैरामीटर प्रकार मेल नहीं खाता" त्रुटि।

3

आपका कोड एक "typename" कीवर्ड की जरूरत है।

std::map<const T, typename std::list<std::pair<T, long int> >::iterator> lookup_map_; 
संबंधित मुद्दे