2012-02-08 13 views
11

Sono abbastanza nuovo di C++ e questo sito quindi ci sono necessariamente errori. Quando provo a compilare il mio codice ottengo errori come error: missing template argument before 'b'. Ho cercato nel mondo risposte per ore e mi ha portato qui.Che cosa significa "argomento modello mancante"?

Il mio compito è quello di implementare una classe di modelli Collection che memorizza una raccolta di oggetti utilizzando un array, lungo con la dimensione corrente della raccolta.

#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

Benvenuti in SO. Questa è una prima domanda piuttosto buona, ma in futuro si prega di provare a pubblicare solo un set minimo di codice che presenta ancora il problema. In questo caso, non avevamo bisogno di leggere l'intero contenuto del modello di classe 'collection' per capire cosa c'era di sbagliato. Spesso, penso che scoprirai che passare attraverso il lavoro di minimizzazione del codice nella tua domanda ti porterà alla risposta prima ancora di pubblicarla! :-) –

+2

Tom, Mat e Bojan sono a posto per la tua domanda immediata. Una volta risolto, avrai un problema con quel terzo file: per istanziare l'oggetto 'collection ' in 'main', il compilatore dovrà vedere il costruttore. Se è in un file separato, non funzionerà. È normale lasciare l'implementazione nell'intestazione, ma se non lo fai, potresti dover "# includere" il terzo file invece di compilarlo normalmente. – Useless

risposta

1

Beh, vi state perdendo un argomento di template. Non è possibile creare un oggetto collection, è solo un modello.

È possibile creare solo per es. a collection<int> o collection<std::string>.

13

Devi dire che cos'è una collezione di.

template <class A> class collection {} 

richiede che lo si utilizza come

collection<int> b; 

o qualche tipo appropriato. Questo fa quindi una raccolta di ints. Non hai detto quello che vuoi una raccolta di.

+0

voglio una collezione di oggetti. Ho provato a inserire ciò che hai detto e mi dà ancora l'errore "riferimento non definito alla raccolta" :: collection() '". non ho bisogno di passare nulla al costruttore. ogni tipo di dati che uso al posto di mi dà ancora lo stesso errore. – Josh

+0

vedere il commento @ Inutile sulla domanda –

1

è necessario specificare il tipo di modello, come int o qualche altro tipo:

collection<int> b; 
0

ci sono un gran numero di errori nel codice. In primo luogo definire il modello in un file di intestazione:

Nel collection.h inserire il seguente:

#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 

Poi, in un file cpp all'interno di una funzione principale effettuare le seguenti operazioni:

collection<int> b; 

Invece di int è possibile utilizzare un tipo diverso, ma il punto principale è che è necessario un tipo per creare un'istanza di un modello.

5

Primo: Istanzia il modello per tipo. Quindi, se avete template <typename obj> class T {...}; lo deve usare come

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

È possibile utilizzare un modello con valore di default per il parametro typename definita nella dichiarazione di modello di classe

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

void main { 
    T<> t; 
} 

ma in ogni caso si dovrebbe mettere le parentesi angolari vuote quando lo uso senza parametro.

Secondo: Durante la dichiarazione del modello, posizionarlo interamente nel file di intestazione. Ogni definizione dei suoi metodi dovrebbe essere nel file "* .h", non chiedermi il motivo, basta non dividerlo nell'intestazione e nel file "cpp".

Spero che aiuti.