2011-11-09 16 views
13

का उपयोग करना किसी को एक स्टडी कंटेनर के value_type का उपयोग कैसे करना चाहिए?
मैं बहुत की तरह उपयोग करने की कोशिश की:एक टेम्पलेटेड पैरामीटर के value_type

#include <vector> 

using namespace std; 

template <typename T> 
class TSContainer { 
private: 
     T container; 
public: 
     void push(T::value_type& item) 
     { 
       container.push_back(item); 
     } 
     T::value_type pop() 
     { 
       T::value_type item = container.pop_front(); 
       return item; 
     } 
}; 
int main() 
{ 
     int i = 1; 
     TSContainer<vector<int> > tsc; 
     tsc.push(i); 
     int v = tsc.pop(); 
} 

लेकिन इस में जो परिणाम:

prog.cpp:10: error: ‘T::value_type’ is not a type 
prog.cpp:14: error: type ‘T’ is not derived from type ‘TSContainer<T>’ 
prog.cpp:14: error: expected ‘;’ before ‘pop’ 
prog.cpp:19: error: expected `;' before ‘}’ token 
prog.cpp: In function ‘int main()’: 
prog.cpp:25: error: ‘class TSContainer<std::vector<int, std::allocator<int> > >’ has no member named ‘pop’ 
prog.cpp:25: warning: unused variable ‘v’ 

मुझे लगा कि यह क्या :: VALUE_TYPE के लिए था?

+0

संभावित डुप्लिकेट [मुझे कहां और क्यों "टेम्पलेट" और "टाइपनाम" कीवर्ड डालना है?] (Http://stackoverflow.com/questions/610245/where-and-why-do-i-have -to-put-the-template-and-typename-keyword) –

+1

जब आप पुन: प्रयोज्य लाइब्रेरी कोड (या यहां तक ​​कि कभी भी) लिख रहे हैं, तो यह भी सलाह दी जाती है कि 'नेमस्पेस std;' का उपयोग न करें। बस सही नामस्थान का जादू करें। –

+0

@ केरेकस्क: यह एक उदाहरण था। –

उत्तर

21

आप typename उपयोग करने के लिए:

typename T::value_type pop() 

और इतने पर।

कारण संकलक नहीं पता कर सकते हैं कि चाहे टी :: VALUE_TYPE एक सदस्य चर का एक प्रकार है (कोई भी एक प्रकार struct X { int value_type; }; को परिभाषित करने से आप में बाधा और टेम्पलेट है कि पारित) है। हालांकि उस फ़ंक्शन के बिना, कोड को पार्स नहीं किया जा सका (क्योंकि कुछ पहचानकर्ता एक प्रकार या चर को निर्दिष्ट करते हैं या नहीं, उदाहरण के लिए T * p गुणा या पॉइंटर घोषणा हो सकती है) के आधार पर परिवर्तनों का अर्थ बदलता है। इसलिए नियम यह है कि जो कुछ भी हो सकता है वह टाइप या वैरिएबल हो और इसे typename के साथ उपसर्ग करके स्पष्ट रूप से चिह्नित नहीं किया गया है उसे एक चर माना जाता है।

+0

स्पष्टीकरण के लिए धन्यवाद! –

+0

@ जोनाथन: आगे स्पष्टीकरण के लिए, यह FAQ भी देखें: [टेम्पलेट 'टाइपनाम' कीवर्ड का उपयोग किस प्रकार किया जाता है?] (Http://www.comeaucomputing.com/techtalk/templates/#typename) – ildjarn

7

typename कीवर्ड का उपयोग यह इंगित करने के लिए करें कि यह वास्तव में एक प्रकार है।

void push(typename T::value_type& item) 

typename T::value_type pop() 
संबंधित मुद्दे