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


Il mistero del router disconnesso

Vorrei rendervi partecipi del misterioso comportamento del mio router, un Netgear DG834G.

La configurazione della mia rete molto semplice. Il mio portatile (che praticamente sempre acceso) connesso tramite scheda di rete wireless, mentre il mio pc fisso (che quasi sempre spento) collegato tramite cavo di rete.

Da sempre mi accade un fatto spiacevole: ogni volta (o quasi) che accendo il pc fisso il modem ADSL integrato nel router perde la sincronizzazione e si disconnette per qualche secondo... il che particolarmente fastidioso se sto scaricando qualcosa.

Oggi mi venuta l'idea di provare a scollegare il cavo di rete del pc, accenderlo, e quindi ricollegare il cavo per vedere se cambiava qualcosa. E purtroppo non cabia nulla, ma il mistero che il modem non si disconnette quando scollego e/o collego il cavo di rete, ma sempre quando accendo il pc, anche se scollegato..!

Com' possibile che un pc completamente scollegato dal router (e anche dalla linea telefonica...) possa influenzarne il comportamento? L'unica cosa che hanno in comune la ciabatta da cui ciucciano la corrente... Mah?!?!

Sabato 29 Dicembre 2007, 00:00:00 GMT + 1:00

tags: informatica, telecomunicazioni


Mai fidarsi di Windows Update

Oggi ho updatato Windows e ho visto che c'era un aggiornamento per i driver della scheda di rete wireless. Con un po' di timore ho deciso di scaricare anche questi driver. Peccato per che dopo l'aggiornamento la scheda di rete non andava piu...

Ho provato a ripristinare i vecchi driver ma niente da fare. Alla fine ho disinstallato completamente la scheda di rete a all'ennesimo riavvio la scheda di rete ha deciso di funzionare di nuovo. Mi chiedo che diavolo di driver mi ha fatto installare il nostro amico Windows Update.

Marted 08 Maggio 2007, 18:47:38 GMT + 2:00

tags: informatica, Windows