[Tech] esperti di C++...

Marco Ermini flug@markoer.org
Mer 9 Gen 2002 18:01:29 CET


Per una volta sono io a chiedere aiuto!!!

Se c'e' una cosa che mi fa inc*****e di gcc e' che il supporto C++ e'
indietrissimo e fa schifo.

Sto cercando di ricompilare un programma con gcc 2.96 oppure 3.01 (li ho
entrambi) ma non mi supporta diverse cose. Il problema e' che non supporta
molte (relativamente) "nuove" sintassi come gli iteratori nested che di solito
si dichiarano friend (non chiedetemi come faccia a discriminare) e devo
tornare a modalita' piu' arcane. Quelle che sono riuscito a riconoscere sono
riuscito a "downgradarle", questa non riesco in modo "pulito".

template<class T, class Alloc>
class doublehash
{
[...]
private:
[...]
protected:
	mutable L l;
	L::iterator i(l);
[...]
}

Questo costrutto non gli garba:

../../lago/minitl/hash_.h:46: invalid use of member `doublehash<T, Alloc>::l'
../../lago/minitl/hash_.h:46: invalid data member initialization
../../lago/minitl/hash_.h:46: (use `=' to initialize static data members)

Lo risolvo in modo "stupido" spostando la dichiarazione dell'iterator i dentro
le funzioni membro che lo usano.

(questa e' protected e si trova subito dopo la dichiarazione di i):

N *n_get(int id) const
{
	N *n;

	for (i.begin(); (n = i.get()); i.next())
		if (n->id == id)
			return n;
	return 0;
}

Cosi' mi dice che "i" non lo conosce, ovviamente. Se tolgo "L::iterator i(l)"
dai membri protetti e lo dichiaro dentro la funzione membro:

N *n_get(int id) const
{
	N *n;
	L::iterator i(l);
	^^^^^^^^^^^^^^^^^

	for (i.begin(); (n = i.get()); i.next())
		if (n->id == id)
			return n;
	return 0;
}

gli garba. Ma ovviamente i e' utilizzato in un'infinita' di altri posti e deve
rimanere membro protected, anche se e' solo un iteratore.

Il costrutto IMHO e' perfettamente legale e MS VC++ lo compila, mentre a gcc
non garba. Qualcuno sa di un workaround per dichiarare "i" membro con una
sintassi che garbi a gcc?


grazie

-- 
Marco Ermini
http://www.markoer.org
Perche' perdere tempo ad imparare quando l'ignoranza e' istantanea? (Hobbes)
-------------- parte successiva --------------
Un allegato non testuale è stato rimosso....
Nome:        non disponibile
Tipo:        application/pgp-signature
Dimensione:  189 bytes
Descrizione: non disponibile
URL:         <http://lists.linux.it/pipermail/flug-tech/attachments/20020109/e78d56d1/attachment.pgp>


Maggiori informazioni sulla lista flug-tech