2010-08-14 5 views
3

J'ai une classe:problème avec la conversion

 template<class T> 
     class MyClass 
     { 
     public: 
       class Iterator { 
    public: 
    Iterator(MyClass<T>&){/*some code*/}; 
    }; 


    operator Iterator(); 
    Iterator& begin(); 
     }; 

    template<class T> 
    MyClass<T>::operator typename MyClass<T>::Iterator() 
    { 
     return MyClass::Iterator(*this); 
    } 

    template<class T> 
    typename MyClass<T>::Iterator& MyClass<T>::begin() 
    { 
     return *this;//<---------------cannot convert from MyClass to MyClass<T>::Iterator 
    } 

Pourquoi ai-je une erreur? J'ai fourni un opérateur de conversion, donc tout devrait bien se passer.

+0

Vous pouvez tout aussi bien supprimer la conversion, car le constructeur d'Iterator autorise déjà la même conversion. – UncleBens

Répondre

3

begin() Impossible de renvoyer une référence à Iterator; il doit retourner un Iterator par valeur.

Lorsque la conversion déclarée par l'utilisateur à Iterator est appelée, elle génère un objet temporaire Iterator. Une référence non-const ne peut pas être liée à une valeur temporaire, d'où l'erreur que vous obtenez lorsque begin() renvoie une référence. Cela dit, avoir une fonction de conversion qui retourne un Iterator est au mieux inhabituel.

+0

mon mauvais je ne l'ai juste pas mis dans l'exemple. Fixez-le en une seconde. – smallB

Questions connexes