Porting C++ da Visual Studio a CGG

Ho da poco acquistato un MacBook e volevo provare a compilare un programma in C++ che sto scrivendo anche sotto Mac con XCode. Io credevo che il codice fosse completamente portabile, perchè non ho utilizzato alcuna strana API di Windows e inoltre ho sviluppato tutta l'interfaccia ed altre parti utilizzando le Qt. Peccato che quando ho provato a compilare il tutto, mi sono usciti un sacco di errori. A quanto sembra il gcc non digerisce molto i template e bisogna avere alcune accortezze.

Prendiamo ad esempio questo pezzo di codice che Visual Studio compila senza problemi:

	//classe punto
	template<class T>
	class Point
	{
	public:
	
		Point(const T& x_, const T& y_, const& T& z_) : x(x_), y(y_),
			z(z_)
		{
		}
		
		T x, y, z;
	}
	
	//
	//
	//
	
	//un metodo qualunque che usa un vettore di punti
	template<class T>
	void myMethod(const vector<Point<T>>& points)
	{
		for(vector<Point<T>>::const_iterator iter = points.begin();
			iter != points.end(); ++iter)
		{
			const Point<T>& p = *iter;
			//fai qualcosa
		}
	}

La classe Point rappresenta semplicemente un punto nello spazio con coordinate che possono essere di vari tipi (es. int o float). Il metodoto myMethod prende come parametro un vettore di punti e fa un'iterazione per elaborarli in qualche modo.

Il primo problema che si incontra è che al gcc non piace la doppia chiusura del template con >>, ma bisogna mettere uno spazio tra i 2 >. Cercando in rete ho inoltre scoperto che è meglio utilizzare la parola chiave typename invece di class nella definizione dei template. Corretti questi due problemi il codice è il seguente:

	//classe punto
	template<typeame T>
	class Point
	{
	public:
	
		Point(const T& x_, const T& y_, const& T& z_) : x(x_), y(y_),
			z(z_)
		{
		}
		
		T x, y, z;
	}
	
	//
	//
	//
	
	//un metodo qualunque che usa un vettore di punti
	template<typename T>
	void myMethod(const vector<Point<T> >& points)
	{
		for(vector<Point<T> >::const_iterator iter = points.begin();
			iter != points.end(); ++iter)
		{
			const Point<T>& p = *iter;
			//fai qualcosa
		}
	}

In teoria questo doveva funzionare, ma purtroppo mi dava ancora degli errori che a prima vista erano incomprensibili, cioè:

	Expected ';' before 'iter';
	'iter' was not declared in this scope

E questo è un vero mistero, però si può risolvere definendo con la parola chiave typename il tipo iteratore. Il codice corretto e compilabile anche col gcc diventa così:

	template<typename T>
	void myMethod(const vector<Point<T> >& points)
	{
		typedef typename vector<Pont<T> >::const_iterator PVCIterator;
		for(PVCIterator iter = points.begin(); iter != points.end();
			++iter)
		{
			const Point<T>& p = *iter;
			//fai qualcosa
		}
	}

Sinceramente non ho ben capito ancora adesso quale sia il problema, ma del resto non è che io conosca perfettamente tutte le varie sfumature del C++... Bè, a Visual Studio piaceva... Ora non mi resta che andare a inserire un sacco di typedef ovunque... gran lavoraccio...

Domenica 25 Ottobre 2009, 10:03:05 GMT + 1:00

tags: C++, gcc, informatica, programmazione, Visual Studio


Commenti

Nessuno ha ancora commentato. Tu puoi essere il primo!

Lascia un commento

Nome (richiesto)
e-mail (opzionale, non verrà pubblicata, utile se si vuole essere contattati)
Non compilare questo
Sito Web (opzionale)
Inserire il codice che compare qui sotto (richiesto)

Commento
_ok_ooahhasdbowdownclapclickcrycry2devildohgogogokillkisskiss2laughmahperfidprrrredsadscratchserioussmilesweatthinkwallxmasyeah