Supposons que j'ai une classe de base qui clonage des classes dérivées:dérivés curieusement modèles récurrents et covariance
class Base
{
public:
virtual Base * clone()
{
return new Base();
}
// ...
};
j'ai un ensemble de classes dérivées qui sont mis en oeuvre en utilisant un motif de modèle curieusement récurrent:
template <class T>
class CRTP : public Base
{
public:
virtual T * clone()
{
return new T();
}
// ...
};
Et je tente de tirer de cette plus comme ceci:
class Derived : public CRTP<Derived>
{
public:
// ...
};
Je reçois des erreurs de compilation à l'effet de:
error C2555: 'CRTP<T>::clone': overriding virtual function return type differs and is not covariant from 'Base::clone'
Je sais que cela est probablement le résultat du compilateur de ne pas connaître entièrement l'arbre d'héritage pour les dérivés lors de l'instanciation CRTP. De plus, le remplacement du type de retour (T *) par (Base *) est également compilé. Cependant, j'aimerais savoir s'il existe un travail qui conserve la sémantique ci-dessus.
Pour ce que ça vaut, GCC 4.1.2 et 4.7.1 à la fois donner des erreurs similaires. –
en double de http://stackoverflow.com/questions/15570333/crtp-and-dynamic-polymorphism-compile-error – erikced
@erikced Merci pour le heads up. Il semble qu'il n'y a pas grand-chose que je puisse faire, je vais juste remplacer le type de retour. – Whanhee