J'ai un code comme celui-ci :
class RetInterface {...}
class Ret1: public RetInterface {...}
class AInterface
{
public:
virtual boost::shared_ptr<RetInterface> get_r() const = 0;
...
};
class A1: public AInterface
{
public:
boost::shared_ptr<Ret1> get_r() const {...}
...
};
Ce code ne se compile pas.
Dans le studio visuel il soulève
C2555 : le type de retour d'une fonction virtuelle diffère et n'est pas covariant
Si je n'utilise pas boost::shared_ptr
mais renvoient des pointeurs bruts, le code se compile (je comprends que cela est dû à types de retour covariants en C++). Je vois que le problème vient du fait que boost::shared_ptr
de Ret1
n'est pas dérivé de boost::shared_ptr
de RetInterface
. Mais je veux revenir boost::shared_ptr
de Ret1
pour une utilisation dans d'autres classes, sinon je dois caster la valeur retournée après le retour.
- Est-ce que je fais quelque chose de mal ?
- Sinon, pourquoi le langage est-il ainsi fait - il devrait être extensible pour gérer la conversion entre pointeurs intelligents dans ce scénario ? Existe-t-il une solution de contournement souhaitable ?
0 votes
Si vous n'utilisez pas boost::shared_ptr, retournez-vous des pointeurs ? Est-ce du C++ géré ?
0 votes
@Lev Si j'essaie de retourner des pointeurs bruts, le code se compile, mais il y a alors un problème de gestion de la mémoire. Non, je n'utilise pas de C++ géré.
0 votes
Ce que je fais : je renvoie des pointeurs bruts mais je précise que l'appelant est responsable de l'encapsulation du pointeur dans un pointeur intelligent, par ex.
std::unique_ptr<Class>(obj.clone())
.0 votes
" Je vois que le problème est dû au fait que boost::shared_ptr de Ret1 n'est pas dérivé de boost::shared_ptr de RetInterface. " Non, ce n'est pas le cas