Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Problema template e file h[c++]

    Ho dichiarato una classe template in un file h e l'ho definita in un file .cpp Quando provo a compilare il programma che usa la classe mi da questo errore:

    codice:
    Errore	1	error LNK2019: riferimento al simbolo esterno "public: __thiscall Pila<int>::~Pila<int>(void)" (??1?$Pila@H@@QAE@XZ) non risolto nella funzione _main	main.obj	PilaCpp
    Errore	2	error LNK2019: riferimento al simbolo esterno "public: __thiscall Pila<char>::~Pila<char>(void)" (??1?$Pila@D@@QAE@XZ) non risolto nella funzione _main	main.obj	PilaCpp
    Errore	3	error LNK2019: riferimento al simbolo esterno "public: __thiscall Pila<char>::Pila<char>(void)" (??0?$Pila@D@@QAE@XZ) non risolto nella funzione _main	main.obj	PilaCpp
    Errore	4	error LNK2019: riferimento al simbolo esterno "public: __thiscall Pila<int>::Pila<int>(int)" (??0?$Pila@H@@QAE@H@Z) non risolto nella funzione _main	main.obj	PilaCpp
    Errore	5	fatal error LNK1120: 4 esterni non risolti	D:\Documents and Settings\Vincenzo\Documenti\Visual Studio 2008\Projects\PilaCpp\Debug\PilaCpp.exe	1	PilaCpp
    Di cosa si tratta? Premetto che ho incluso nel file il .h della classe

  2. #2
    Difficile aiutarti se non posti il codice completo.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    codice:
    //Pila.h
    
    template <class T>
    class Pila{
    
    public:
    	Pila(int = MAXD);
    	Pila(const Pila<T>&);
    	~Pila();
    
    	bool push(const T&);
    	bool pop(T&);
    	bool top(T&);
    
    	bool piena();
    	bool  vuota();
    	void reset();
       /*	Pila operator = (Pila);
    	Pila operator = (const Pila&); */
    private:
    	 int cima;
    	 T *dati;
    	 int MAX;
    	 static const int MAXD;
    };
    codice:
    //Pila.cpp
    
    
    #include <assert.h>
    #include "Pila.h"
    
    
    template <class T>
    Pila<T>::Pila()
    {
    	MAX = MAXD;
    	cima = 0;
    	dati = new (nothrow) T[MAX];
    	assert(dati != NULL);
    }
    
    template <class T>
    Pila<T>::Pila(int d)
    {
    	assert(d>0);
    	MAX = d;
    	cima = 0;
    	dati = new (nothrow) T[MAX];
    	assert(dati != NULL);
    }
    
    template <class T>
    Pila<T>::~Pila()
    {
    	delete dati[];
    }
    
    template <class T>
    Pila<T>::Pila(const Pila& p)
    {
       this->cima = p.cima;
       this->MAX = p.MAX;
       this->dati = new (nothrow) T[MAX];
       assert(dati != NULL);
       for(int i=0;i<cima;i++)
       {
    		this->dati[i] = p.dati[i]
       }
    }
    
    template <class T>
    bool Pila<T>::push(T x)
    {
    	if(codaPiena())
    	   return false;
    	dati[cima++] = x;
    	return true;
    }
    
    template <class T>
    bool Pila<T>::pop(T& x)
    {
    	if(codaVuota())
    	   return false;
    	x = dati[--cima];
    	return true;
    }
    
    template <class T>
    bool Pila<T>::codaVuota()
    {
    	return (cima == 0);
    }
    
    template <class T>
    bool Pila<T>::codaPiena()
    {
    	return (cima == MAX);
    }
    
    template <class T>
    void Pila<T>::reset()
    {
    	cima = 0;
    }
    codice:
    //main.cpp
    
    #include <iostream>
    #include "Pila.h"
    
    using namespace std;
    
    int main(){
    	Pila<int> p1(40);
    	Pila<int> q;
    	Pila<char> p2;
    	p1.push(15);
    	p2.push('C');
            //q = p1;
    	cin.get();
    	return 0;
    }
    Uso Visual Studio 2008 SP1, in ambiente Windows (XP sp3)

  4. #4
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    Ciao ... A meno che il compilatore non supporti le specifiche della parola chiave export (che da quel che so nessun compilatore supporta) devi definire i metodi delle classi template nell' header...
    C++ 4ever
    496e2062696e6172696f206e6f6e2063692061767265737469 206e656d6d656e6f2020726f7661746f203a29

  5. #5
    Perchè? Che problema c'è? Non dovrebbe funzionare come fa per le altre classi normalmente? Come si usa la keyword export(ho cercato con google ma non ho trovato quasi niente).

  6. #6
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    i template vogliono la definizione dei metodi nello stesso file della loro implementazione..

  7. #7
    e come si usa la keyword export?

  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    http://www.parashift.com/c++-faq-lit...html#faq-35.14

    Ma è inutile se non hai il compilatore Comeau.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  9. #9
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    export non è standard.. non usarla ameno che non sia obbligato..

    a cosa ti serve? che problemi hai a mettere tutto in un .h?

  10. #10
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da Stoicenko
    export non è standard..
    Veramente è standard solo che i produttori di compilatori non hanno interesse a svilupparla per i template.
    The future of the export keyword is unknown. Without taking sides in the debate, I will simply report that some compiler vendors are indicating they might never implement it, and that the C++ standards committee has decided to leave it in.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.