Newsgroup: it.comp.lang.c++
Titolo: [?] template

Salve a tutti.
Ho due problemi con i template.
Ho incluso la definizione della classe-template nel file .h come
solito e l'implementaizione in un file .cpp.
Ho creato poi un file main.cpp in cui ho messo una direttiva #include
al file .h contenente la definizione della classe-template. Nel file
main.cpp c'e' un la funzione main che funge da ambiente di test per la
classe. Purtroppo pero' non funziona. Rileva un errore nelle righe in
cui richiamo funzioni membro della classe-template. E' un errore del
linker: dice che non trova la funzione membro tra i file oggetto. Ho
provato a mettere tutto nel file main.cpp (definizione,
implementazione e ambiente di test) e funziona tutto correttamente.
Sotto ho postato un estratto del codice. Il compilatore che uso e il
VC++ 6.0 Sp6.
Il secondo problema riguarda invece l'overload degli operatori + e -. 
Vorrei che il valore restituito sia dello stesso tipo del parametro
implicito (mettiamo Miaclasse<double,double>) mentre dovrebbe essere
possibile passare un oggetto di una diversa instanza del modello
(mettiamo Miaclasse<int,double> ma anche Miaclasse<float,int> oppure
Miaclasse<double,double>).
Grazie anticipatamente e dipsonibile (ovviamente) per ulteriori
chiarimenti.
Salvo.
/**************************/
class.h
/**************************/
#ifndef CLASS_H
#define CLASS_H
template<typename T1,typename T2> class Miaclasse;
template<typename T1,typename T2>
class Miaclasse
{
public:
	Miaclasse(T1 a,T2 b);
	void set_a(T1 a);
	void set_b(T2 b);
	T1 get_a() const;
	T2 get_b() const;
	Miaclasse<T1,T2> operator+(const Miaclasse<T1,T2> &m);
	Miaclasse<T1,T2> operator-(const Miaclasse<T1,T2> &m);
private:
	T1 _a;
	T2 _b;
};
#end if
/**************************/
class.cpp
/**************************/
#include "class.h"
template<typename T1,typename T2>
Miaclasse<T1,T2>::Miaclasse(T1 a,T2 b)
	{
	_a = a;
	_b = b;
	}
template<typename T1,typename T2>
void Miaclasse<T1,T2>::set_a(T1 a)
	{
	_a = a;
	}
template<typename T1,typename T2>
void Miaclasse<T1,T2>::set_b(T2 b)
	{
	_b = b;
	}
template<typename T1,typename T2>
T1 Miaclasse<T1,T2>::get_a() const
	{
	T1 r = _a;
	return r;
	}
template<typename T1,typename T2>
T2 Miaclasse<T1,T2>::get_b() const
	{
	T2 r = _b;
	return r;
	}
template<typename T1,typename T2>
Miaclasse<T1,T2> Miaclasse<T1,T2>::operator+(const Miaclasse<T1,T2>
&f)
	{
	return Frazione<T1,T2>(_a + f._a, _b + f._b);
	}
template<typename T1,typename T2>
Miaclasse<T1,T2> Miaclasse<T1,T2>::operator-(const Miaclasse<T1,T2>
&f)
	{
	return Frazione<T1,T2>(_a - f._a, _b - f._b);
	}
/**************************/
main.cpp
/**************************/
#include <iostream>
#include "class.h"
using namespace std;
void main()
{
	Miaclasse pippo(5,10);
	Miaclasse pippo2(20,40);
	Miaclasse pippo3 = pippo + pippo2;
	cout << pippo3.get_a() << " " << pippo3.get_b() << "\n";
 
}

 classe. Purtroppo pero' non funziona. 
Tutto il codice del template deve essere presente quando il compilatore 
compila una "transational unit". Nel tuo caso dovresti aggiungere nel 
file class.h alla fine una direttiva #include "class.cpp" oppure piu' 
semplicemente definendo tutti i metodi all'interno della definizione 
della classe.
Esempio:
template<class T>
class MiaClasse
{
public:
    MiaClasse ()
    {
	//TODO: costruttore
    }
    void MioMetodo ()
    {
         //TODO: Mio metodo
    }
    T MioMetodo2 ()
    {
	//TODO: fai qualcosa
    }
};
cio' che vuoi fare tu e' possibile usano la parola riservata export che 
ad oggi se non sbaglio e' implementata solo dall'ultima versione del 
compilatore Comeau
per maggiori info su questa parola riservata va su
http://www.comeaucomputing.com/4.0/docs/userman/export.html


http://www.comeaucomputing.com/4.0/docs/userman/export.html
ho dato un'occhiata veloce, non mi pare di aver visto una versione
freeware di questo compilatore. esiste?

 freeware di questo compilatore. esiste?
No, non esiste, ma esiste una pagina web dove si puo' postare del
codice per provarlo. Ho postato il link in un altro thread.
Ciao,
Nicola

codice per provarlo. Ho postato il link in un altro thread.
grazie per le esaurienti risposte