2010-07-29 16 views
3

J'ai ma propre classe SmartPointer.Problème de surcharge de l'opérateur de conversion C++

Il y a des cas où SmartPtr contiennent une classe qui inherite d'une classe de base, et je voudrais convertir SmartPtr<ClassX> into SmartPtr<BaseClassOfClassX>;

Je suis en train de surcharger l'opérateur de conversion SmartPtr pour le faire.

Il fonctionne très bien pour la classe themself, tels que:

template<class newType> 
operator SmartPtr<newType>() const 
{ 
    return SmartPtr<newType>((SmartPtr<newType>*)this); 
} 

mais pas pour pointeur vers la classe, j'ai essayé ce qui suit, et il ne fait jamais appel et obtenir l'erreur suivante:

template<class newType> 
operator SmartPtr<newType>*() const 
{ 
     return static_cast<SmartPtr<newType>*>(this); 
} 

code simple pour obtenir l'erreur:

SmartPtr<ClassX> test(pClassX); 
    SmartPtr<BaseClassOfClassX>* ob = &test; 

ERROR: 
cannot convert from 'SmartPtr<T> *' to 'SmartPtr<T> *' 

quelqu'un voit ce qui ne va pas avec mon deuxième surcharge de conversion? Merci

Répondre

0

Du C++ standard: "Une fonction d'opérateur doit être soit une fonction membre non-statique ou une fonction non-membre qui a au moins un paramètre dont le type est une classe, une référence à une classe , une énumération, ou une référence à une énumération. "

Comme le type de &test n'est pas une classe, ni quoi que ce soit implicitement convertible à une classe, vous ne pouvez pas surcharger les typecasts sur le pointeur directement. Selon la raison pour laquelle vous avez besoin de pointeurs vers vos pointeurs intelligents, peut-être que vous voulez vraiment utiliser des références qui est beaucoup plus commun.