class Prova{ public: enum Ciao { UNO, DUE }};Prova::Ciao x = Prova::Ciao::UNO; // ok con MSVC2005, errore con GCC e SNCProva::Ciao y = Prova::UNO; // ok con tuttiProva::Ciao z = x+1; // ok con MSVC2005 e GCC (però da un warning), errore con SNC
template <typename T>class Cane<T>{ protected: T mCoda;};template <typename T>class Prova<T> : public Cane<T>{ Prova<T>(const T& parametro) { mCoda = parametro; // Errore su GCC, ok su MSVC2005 e su SNC this.mCoda = parametro; // Ok su tutti }};
Onestamente mi sembra contortissima questa gestione degli scope
Citazione da: "TheKaneB"Citazione da: "dsar"Onestamente mi sembra contortissima questa gestione degli scopesullo Stroustrup ci sono tipo 100 pagine dedicate solo alla risoluzione degli scope... per evitare problemi mi sono autovietato di usare "using namespace" e uso SEMPRE il full scope di ogni cosa, e buona notte...sarà più prolisso da scrivere, ma evita qualsiasi bug subdolo dovuto a name clashing...Anche il caso da te detto prima andrebbe messo sotto scope esplicito, non ho capito perché dare alle variabili globali il livello più basso,
Citazione da: "dsar"Onestamente mi sembra contortissima questa gestione degli scopesullo Stroustrup ci sono tipo 100 pagine dedicate solo alla risoluzione degli scope... per evitare problemi mi sono autovietato di usare "using namespace" e uso SEMPRE il full scope di ogni cosa, e buona notte...sarà più prolisso da scrivere, ma evita qualsiasi bug subdolo dovuto a name clashing...
ci sono casi semplici in cui non vale la pena usare le classi. Sarà che ho sempre usato linguaggi OOP con il module as manager (Ada) e non il module as type (come il class del C++).
In ogni caso il discorso è semplice, tu non devi impossibilitare i tuoi client l'uso dei nomi delle variabili che vogliono perché la tua classe li occupa. Questo non vale solo per le variabili globali, ma anche per chi vuole estendere la tua classe.
Comunque tornando al discorso dei template e classi, in effetti è molto incoerente
class Pilota : public Subscriber<PhysicsEventPublisher>, public Subscriber<NetworkEventPublisher>{...};
class Pilota{private: Subscriber<PhysicsEventPubliser> mPhysicsSubscriber; Subscriber<NetworkEventPublisher> mNetworkSubscriber;};
per il discorso delle enum, anch'io preferisco l'implementazione di MSVC.
Citazione da: "clros"Illuminatemi: perchè non dovrebbe essere corretto l'esempio che hai riportato con gli enum? Per me (e per le mie poche conoscenze) è "logico", non capisco perche GCC non lo compili...Perché lo standard C++ non prevede uno scope per gli enum,[...]
Illuminatemi: perchè non dovrebbe essere corretto l'esempio che hai riportato con gli enum? Per me (e per le mie poche conoscenze) è "logico", non capisco perche GCC non lo compili...
Che version di GCC hai? Considera che molti vendor di hardware e molte distribuzioni usano l'ultima versione GPL-2, ovvero la 4.2.
Citazione da: "TheKaneB"Citazione da: "dsar"Onestamente mi sembra contortissima questa gestione degli scopesullo Stroustrup ci sono tipo 100 pagine dedicate solo alla risoluzione degli scope... per evitare problemi mi sono autovietato di usare "using namespace" e uso SEMPRE il full scope di ogni cosa, e buona notte...sarà più prolisso da scrivere, ma evita qualsiasi bug subdolo dovuto a name clashing...No aspetta..a me lo GCC mi dà dei warning (o degli errori, ads non ricordo) nel caso di ambiguità...per cui ho continuato a usare "using namespace" e usare il full scope SOLO nel caso di ambiguità...
Non so essere più preciso perchè vado a memoria, ti parlo di esperimenti fatti in azienda un anno fa. Adesso non ho più la possibilità di rifare i test e valutare tutti i casi. E' probabile che una versione diversa di GCC dia diversi risultati, o magari una particolare combinazione di flag di compilazione. Non so quanto questo possa influire, ma il GCC in questione era la versione cross-compiler per playstation 3, quindi non so nemmeno quali patch abbiano applicato quelli di SCE-DEV (Sony Computer Enterteinment).