2012-02-08 22 views
11

मैं सी ++ के लिए काफी नया हूं और यह साइट इसलिए त्रुटियों के लिए बाध्य हैं। जब मैं अपना कोड संकलित करने का प्रयास करता हूं तो मुझे error: missing template argument before 'b' जैसी त्रुटियां मिलती हैं। मैं घंटों के जवाब के लिए दुनिया की खोज कर रहा हूं और उसने मुझे यहां ले जाया है।"अनुपलब्ध टेम्पलेट तर्क" का क्या अर्थ है?

मेरा असाइनमेंट एक टेम्पलेटेड क्लास संग्रह को कार्यान्वित करना है जो संग्रह के वर्तमान आकार के साथ के साथ ऑब्जेक्ट का उपयोग करने वाले ऑब्जेक्ट्स का संग्रह करता है।

#include <iostream> 
    #include "collection.h" 

    using namespace std; v 

    int main(int argc, char* argv[]) 
    { 
     collection b; //<----error missing template argument before 'b' 
     return 0; 
    } 

#ifndef COLLECTION_H 
    #define COLLECTION_H 

    #include <iostream> 

    template <typename obj> 
    class collection 
    { 
    public: 
     collection(); 
     bool isEmpty() const; 
     void makeEmpty(); 
     void insert(obj val); 
     void remove(obj val); 
     bool contains(obj val) const; 
    private: 
     size_t size; 
     obj* col[]; 
    }; 

    #endif 

#include "collection.h" 

    template <typename obj> 
    collection<obj>::collection() :size(10) 
    { 
     col = new obj*[size]; 
    } 

    template <typename obj> 
    bool collection<obj>::isEmpty() const 
    { 
     for(size_t k = 0; k < size; k++) 
     { 
      if(col[k] != NULL) 
       return false; 
     } 
     return true; 
    } 

    template <typename obj> 
    void collection<obj>::makeEmpty() 
    { 
     for(size_t k = 0; k < size; k++) 
     { 
      col[k] = NULL; 
     } 
    } 

    template <typename obj> 
    void collection<obj>::insert(obj val) 
    { 
     int temp = 0; 
     for(size_t s = 0; s < size; s++) 
     { 
      if(col[s] != NULL) 
       temp++; 
     } 
     if(temp >= size) 
     { 
      obj* temp = new obj*[size*2]; 

      for(size_t c = 0; c < size; c++) 
       temp[c] = col[c]; 

      delete col; 
      col = temp; 
     } 
     else 
      col[temp] = val; 
    } 

    template <typename obj> 
    void collection<obj>::remove(obj val) 
    { 
     for(size_t x = 0; x < size; x++) 
     { 
      if (col[x] == val) 
      { 
       for(size_t y = x; y < size-1; y++) 
       { 
        col[y] = col[y+1]; 
       } 
       col[size-1] = NULL; 
       return; 
      } 
     } 
    } 

    template <typename obj> 
    bool collection<obj>::contains(obj val) const 
    { 
     for(size_t z = 0; z < size; z++) 
     { 
      if(col[z] == val) 
       return true; 
     } 
     return false; 
    } 
+5

SO में आपका स्वागत है। यह एक बहुत अच्छा पहला सवाल है, लेकिन भविष्य में कृपया केवल एक न्यूनतम कोड पोस्ट करने का प्रयास करें जो अभी भी समस्या को प्रदर्शित करता है। इस मामले में, हमें यह पता लगाने के लिए 'संग्रह' वर्ग टेम्पलेट की संपूर्ण सामग्री को पढ़ने की आवश्यकता नहीं थी कि क्या गलत था। अक्सर, मुझे लगता है कि आप पाएंगे कि आपके प्रश्न में कोड को कम करने के काम के माध्यम से आपको पोस्ट करने से पहले जवाब मिल जाएगा! :-) –

+2

टॉम, मैट और बोजन आपके तत्काल प्रश्न के बारे में बिल्कुल सही हैं। एक बार जब आप इसे ठीक कर लेंगे, तो आपको उस तीसरे फ़ाइल में कोई समस्या होगी: 'संग्रह ' ऑब्जेक्ट को 'मुख्य' में तुरंत चालू करने के लिए, कंपाइलर को कन्स्ट्रक्टर को देखने की आवश्यकता होगी। अगर यह एक अलग फ़ाइल में है, तो यह काम नहीं करेगा। हेडर में कार्यान्वयन को छोड़ना आम बात है, लेकिन यदि आप नहीं करते हैं, तो आपको इसे सामान्य रूप से संकलित करने की बजाय तीसरी फ़ाइल को # शामिल करना पड़ सकता है। – Useless

उत्तर

1

ठीक है, आप किसी टेम्पलेट तर्क खो रहे हैं। आप collection ऑब्जेक्ट नहीं बना सकते हैं, यह सिर्फ एक टेम्पलेट है।

आप केवल उदाहरण बना सकते हैं एक collection<int> या collection<std::string>

13

आपको यह कहना है कि यह किस संग्रह का संग्रह है।

template <class A> class collection {} 

आवश्यकता है कि आप

collection<int> b; 

या कुछ उचित प्रकार के रूप में उपयोग। तब वह चींटियों का संग्रह करता है। आपने यह नहीं बताया है कि आप किस संग्रह का संग्रह चाहते हैं।

+0

मुझे वस्तुओं का संग्रह चाहिए। मैंने जो कहा है उसे डालने का प्रयास किया और यह मुझे अभी भी " संग्रह" (संग्रह ') में त्रुटि "अनिर्धारित संदर्भ" त्रुटि देता है। मुझे कन्स्ट्रक्टर को कुछ भी पास करने की ज़रूरत नहीं है। के स्थान पर उपयोग किए जाने वाले प्रत्येक डेटा प्रकार में भी मुझे वही त्रुटि मिलती है। – Josh

+0

प्रश्न पर @ Useless की टिप्पणी देखें –

1

आप int या कुछ अन्य प्रकार की तरह, टेम्पलेट के लिए प्रकार निर्दिष्ट करना होगा:

collection<int> b; 
0

वहाँ अपने कोड में त्रुटियों की एक बड़ी संख्या है। सबसे पहले एक हेडर फाइल में अपने टेम्पलेट को परिभाषित: निम्न उपाय अपनाते हैं

#ifndef COLLECTION_H 
#define COLLECTION_H 

    template <typename obj> 
    class collection 
    { 
    public: 
     collection() {} 
     bool isEmpty() const; 
     void makeEmpty(); 
     void insert(obj val); 
     void remove(obj val); 
     bool contains(obj val) const; 
    private: 
     size_t size; 
     obj* col[]; 
    }; 

#endif 
फिर एक मुख्य कार्य के अंदर एक .cpp फ़ाइल में

:

collection<int> b; 

इसके बजाय

collection.h में निम्नलिखित डाल int का आप एक अलग प्रकार का उपयोग कर सकते हैं लेकिन मुख्य बिंदु यह है कि आपको टेम्पलेट को चालू करने के लिए एक प्रकार की आवश्यकता है।

5

पहले: प्रकार के अनुसार टेम्पलेट इंस्टेंट करें। तो अगर आप template <typename obj> class T {...}; है आप इसे पसंद

void main { 
    T<int> t; 
    T<bool> t1; // .. etc 
} 

का उपयोग करना चाहिए आप typename पैरामीटर वर्ग टेम्पलेट घोषणा

template <typename obj = int> class T {/*...*/}; 

void main { 
    T<> t; 
} 

में परिभाषित के लिए डिफ़ॉल्ट मान के साथ एक टेम्पलेट का उपयोग कर सकते हैं, लेकिन फिर भी आप खाली कोण कोष्ठक रखना चाहिए जब पैरामीटर के बिना इसका इस्तेमाल करें।

दूसरा: टेम्पलेट घोषित करते समय, इसे हेडर फ़ाइल में रखें। उनकी विधियों की प्रत्येक परिभाषा फ़ाइल "* .h" में होनी चाहिए, मुझसे मत पूछें, बस इसे हेडर और "सीपीपी" फ़ाइल में विभाजित न करें।

उम्मीद है कि यह मदद करता है।

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