PDA

View Full Version : [C++] Tipo di ritorno in una classe templetizzata


Isomarcus
08-11-2006, 13:06
Ciao a tutti,

ho un problema con una ridefinizione esterna di un operatore di una classe annidata in una classe templetizzata... la ridefinizione che crea problemi è questa

classeuno<K>::classedue& classeuno<K>::classedue::operator++()

che in pratica è la ridefinizione dell'operatore di incremento per la classedue che è annidata dentro classeuno, classe templetizzata a K, che mi ritorna un riferimento ad un oggetto della classedue.

l'errore che mi dà il compilatore è che si aspetta un costruttore, distruttore o convertitore di tipo prima dell' "&"... e non capisco perchè! ho provato di tutto ma continua a darmi l'errore...

un enorme grazie a chiunque contribuirà :)

cionci
08-11-2006, 14:23
Puoi fare un esempio completo di codice che rende lo stesso errore ?

Isomarcus
08-11-2006, 16:13
allora la situazione generale più o meno è questa, ho una classe annidata dentro un'altra classe templetizzata. sto ridefinendo l'operatore di incremento ++ esternamente (nello stesso file header della classe templetizzata, a scanso di equivoci)...


template <class K>
class classeuno {
private:
....;
public:
class classedue {
public:
classedue& operator++(); //ridefinizione op di incr.
....;
};
....
};

template <class K>
classeuno<K>::classedue& classeuno<K>::classedue::operator++() {
....;
}


questo codice compilato nel dev-cpp 4.9.9.2 dà un errore "expected constructor, destructor or type conversion before "&" token... in pratica non riconosce il tipo di ritorno della ridefinizione esterna.

Isomarcus
08-11-2006, 16:17
risolto!


vuole un typename davanti al tipo di ritorno nella ridefinizione esterna, la cui sintassi corretta diventa

template <class K>
typename classeuno<K>::classedue& classeuno<K>::classedue::operator++() {}




anche se non ho ben chiaro il perchè...

marco.r
08-11-2006, 16:49
risolto!


vuole un typename davanti al tipo di ritorno nella ridefinizione esterna, la cui sintassi corretta diventa

template <class K>
typename classeuno<K>::classedue& classeuno<K>::classedue::operator++() {}




anche se non ho ben chiaro il perchè...
Perche' senza typename il compilatore non e' abbastanza intelligente da capire che si tratta di un tipo invece che una variabile di classe.

Isomarcus
08-11-2006, 19:02
però provando col gcc 4.1 compila correttamente (anche se spara fuori un warning)... ok beh sono contento di aver capito :) grazie!