Oppure

Loading
07/09/10 19:39
mi chiedevo se era possibile aggiungere dei metodi template a una classe NON template.
Io ho provato cosi :


file .h

class prova{
public :
     template <class type>void funz();
};


file .cpp

template<class type> prova::void funz()
{
  cout<<"hellO"<<endl;
}




ovviamente la classe è diversa, questa è solo un esempio.
Quando compilo per il compilatore mi da errore
07/09/10 19:58
Poggi Marco
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.
aaa
08/09/10 12:45
nono xD...questo è solo un esempio...la funzione vera su cui lavoro accetta ovviamente dei parametri :rotfl:
08/09/10 15:04
BlueWay
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???
aaa
08/09/10 15:38
certo, avevo postato quella per semplicita,xD ma come vuoi :

ecco questa è la classe nel file header
class mouse : public point
{
 public :
	 mouse();

	 ....


     template<class type> bool is_over(type);
 
 private :
	 std::string mouseState;
	 bool leftClicked;
	 bool rightClicked;
	 
};



e questa è l'implementazione nel file .cpp

template<class type>
bool mouse::is_over(type sprite) 
{
if(this->getX() != 0 && this->getY() != 0)

if(this->getX() > sprite.getX() && this->getX()    < sprite.getX()+sprite.getWidth() 
&&   this->getY() > sprite.getY() && this->getY() <     sprite.getY()+sprite.getHeight())

	return true;
else
	return false;
}


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

class dinamic_sprite : public static_sprite
{
   public :
	   dinamic_sprite();
	   

	   void move();
	   
           ........


   protected :
	     
         mouse mouseClick;
		
		

};



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

void dinamic_sprite::move()
{ 

 
  if(!(mouseClick.is_over<dinamic_sprite>(*this)))
     {			
    	...
      }

  
}


il compilatore mi da come errore :

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)


fatal error LNK1120: 1 esterni non risolti






Ultima modifica effettuata da 08/09/10 16:09
04/10/10 2:22
TheKaneB
Postato originariamente da carlduke:

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

ecco questa è la classe nel file header
class mouse : public point
{
 public :
	 mouse();

	 ....


     template<class type> bool is_over(type);
 
 private :
	 std::string mouseState;
	 bool leftClicked;
	 bool rightClicked;
	 
};



e questa è l'implementazione nel file .cpp

template<class type>
bool mouse::is_over(type sprite) 
{
if(this->getX() != 0 && this->getY() != 0)

if(this->getX() > sprite.getX() && this->getX()    < sprite.getX()+sprite.getWidth() 
&&   this->getY() > sprite.getY() && this->getY() <     sprite.getY()+sprite.getHeight())

	return true;
else
	return false;
}


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

class dinamic_sprite : public static_sprite
{
   public :
	   dinamic_sprite();
	   

	   void move();
	   
           ........


   protected :
	     
         mouse mouseClick;
		
		

};



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

void dinamic_sprite::move()
{ 

 
  if(!(mouseClick.is_over<dinamic_sprite>(*this)))
     {			
    	...
      }

  
}


il compilatore mi da come errore :

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)


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:

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