Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Funzioni template in una classe
Forum - C/C++ - Funzioni template in una classe

Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
mi chiedevo se era possibile aggiungere dei metodi template a una classe NON template.
Io ho provato cosi :


file .h

Codice sorgente - presumibilmente C/C++

  1. class prova{
  2. public :
  3.      template <class type>void funz();
  4. };



file .cpp

Codice sorgente - presumibilmente Plain Text

  1. template<class type> prova::void funz()
  2. {
  3.   cout<<"hellO"<<endl;
  4. }





ovviamente la classe è diversa, questa è solo un esempio.
Quando compilo per il compilatore mi da errore

PM
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Up
1
Down
V
Segnala al moderatore
Postato alle 21:58
Martedì, 07/09/2010
Certamente è possibile aggiungere funzioni template ad una classe non template.

Nel tuo caso, il compialtore da errore perchè hai devinito una funzione void che non accetta parametri.

PM
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Up
1
Down
V
Segnala al moderatore
Postato alle 4:22
Lunedì, 04/10/2010
Testo quotato

Postato originariamente da carlduke:

certo, avevo postato quella per semplicita,xD ma come vuoi :

ecco questa è la classe nel file header
Codice sorgente - presumibilmente C++

  1. class mouse : public point
  2. {
  3.  public :
  4.          mouse();
  5.  
  6.          ....
  7.  
  8.  
  9.      template<class type> bool is_over(type);
  10.  
  11.  private :
  12.          std::string mouseState;
  13.          bool leftClicked;
  14.          bool rightClicked;
  15.          
  16. };




e questa è l'implementazione nel file .cpp

Codice sorgente - presumibilmente C++

  1. template<class type>
  2. bool mouse::is_over(type sprite)
  3. {
  4. if(this->getX() != 0 && this->getY() != 0)
  5.  
  6. if(this->getX() > sprite.getX() && this->getX()    < sprite.getX()+sprite.getWidth()
  7. &&   this->getY() > sprite.getY() && this->getY() <     sprite.getY()+sprite.getHeight())
  8.  
  9.         return true;
  10. else
  11.         return false;
  12. }



type deve essere una delle classi che ho creato io con questa gerarchia

-class point {}
        
-class static_sprite : public point { }

-class dinamic_sprite : public static_sprite { }

:)


quando dalla classe dinamic_sprite

Codice sorgente - presumibilmente C++

  1. class dinamic_sprite : public static_sprite
  2. {
  3.    public :
  4.            dinamic_sprite();
  5.            
  6.  
  7.            void move();
  8.            
  9.            ........
  10.  
  11.  
  12.    protected :
  13.              
  14.          mouse mouseClick;
  15.                
  16.                
  17.  
  18. };




invoco il metodo mouse::is_over(type) dal  metodo move

Codice sorgente - presumibilmente C/C++

  1. void dinamic_sprite::move()
  2. {
  3.  
  4.  
  5.   if(!(mouseClick.is_over<dinamic_sprite>(*this)))
  6.      {                 
  7.         ...
  8.       }
  9.  
  10.  
  11. }



il compilatore mi da come errore :

Codice sorgente - presumibilmente C/C++

  1. error LNK2019: riferimento al simbolo esterno "public: bool __thiscall mouse::is_over<class dinamic_sprite>(class dinamic_sprite)" (??$is_over@Vdinamic_sprite@@@mouse@@QAE_NVdinamic_sprite@@@Z) non risolto nella funzione "public: void __thiscall dinamic_sprite::move(void)" (?move@dinamic_sprite@@QAEXXZ)
  2.  
  3.  
  4. fatal error LNK1120: 1 esterni non risolti




  



l'esperienza mi ha insegnato che l'implementazione di template è la parte più "cessa" di tutti i compilatori C++ attuali.

Prova a spostare l'implementazione del metodo direttamente nel file header. Se ancora non funziona, rendi templata l'intera classe. Una terza via sarebbe quella di creare una funzione statica (cioè fuori da ogni classe) che prende in input due parametri:

Codice sorgente - presumibilmente C/C++

  1. template <class T> bool is_over(mouse& theMouse, T& sprite);


PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Up
0
Down
V
Segnala al moderatore
Postato alle 14:45
Mercoledì, 08/09/2010
nono xD...questo è solo  un esempio...la funzione vera su cui lavoro accetta ovviamente dei parametri :rotfl:

PM
Avatar
BlueWay (Normal User)
Rookie


Messaggi: 49
Iscritto: 21/03/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 17:04
Mercoledì, 08/09/2010
Testo quotato

Postato originariamente da carlduke:

nono xD...questo è solo  un esempio...la funzione vera su cui lavoro accetta ovviamente dei parametri :rotfl:


Potresti postare quella su cui lavori, che possa tu ricevere aiuto???

PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Up
0
Down
V
Segnala al moderatore
Postato alle 17:38
Mercoledì, 08/09/2010
certo, avevo postato quella per semplicita,xD ma come vuoi :

ecco questa è la classe nel file header
Codice sorgente - presumibilmente C++

  1. class mouse : public point
  2. {
  3.  public :
  4.          mouse();
  5.  
  6.          ....
  7.  
  8.  
  9.      template<class type> bool is_over(type);
  10.  
  11.  private :
  12.          std::string mouseState;
  13.          bool leftClicked;
  14.          bool rightClicked;
  15.          
  16. };




e questa è l'implementazione nel file .cpp

Codice sorgente - presumibilmente C++

  1. template<class type>
  2. bool mouse::is_over(type sprite)
  3. {
  4. if(this->getX() != 0 && this->getY() != 0)
  5.  
  6. if(this->getX() > sprite.getX() && this->getX()    < sprite.getX()+sprite.getWidth()
  7. &&   this->getY() > sprite.getY() && this->getY() <     sprite.getY()+sprite.getHeight())
  8.  
  9.         return true;
  10. else
  11.         return false;
  12. }



type deve essere una delle classi che ho creato io con questa gerarchia

-class point {}
        
-class static_sprite : public point { }

-class dinamic_sprite : public static_sprite { }

:)


quando dalla classe dinamic_sprite

Codice sorgente - presumibilmente C++

  1. class dinamic_sprite : public static_sprite
  2. {
  3.    public :
  4.            dinamic_sprite();
  5.            
  6.  
  7.            void move();
  8.            
  9.            ........
  10.  
  11.  
  12.    protected :
  13.              
  14.          mouse mouseClick;
  15.                
  16.                
  17.  
  18. };




invoco il metodo mouse::is_over(type) dal  metodo move

Codice sorgente - presumibilmente C/C++

  1. void dinamic_sprite::move()
  2. {
  3.  
  4.  
  5.   if(!(mouseClick.is_over<dinamic_sprite>(*this)))
  6.      {                 
  7.         ...
  8.       }
  9.  
  10.  
  11. }



il compilatore mi da come errore :

Codice sorgente - presumibilmente C/C++

  1. error LNK2019: riferimento al simbolo esterno "public: bool __thiscall mouse::is_over<class dinamic_sprite>(class dinamic_sprite)" (??$is_over@Vdinamic_sprite@@@mouse@@QAE_NVdinamic_sprite@@@Z) non risolto nella funzione "public: void __thiscall dinamic_sprite::move(void)" (?move@dinamic_sprite@@QAEXXZ)
  2.  
  3.  
  4. fatal error LNK1120: 1 esterni non risolti





Ultima modifica effettuata da il 08/09/2010 alle 18:09
PM
Usa i commenti per chiedere spiegazioni o ringraziare le risposte.