Angenommen, ich habe eine Basisklasse, die die Klonierung von abgeleiteten Klassen:Derived eigentümlich wiederkehrende Vorlagen und Kovarianz
class Base
{
public:
virtual Base * clone()
{
return new Base();
}
// ...
};
Ich habe eine Reihe von abgeleiteten Klassen, die ein eigentümlich wiederkehrend Schablonenmuster implementiert sind:
template <class T>
class CRTP : public Base
{
public:
virtual T * clone()
{
return new T();
}
// ...
};
Und ich versuche, von dem weiter wie folgt abzuleiten:
class Derived : public CRTP<Derived>
{
public:
// ...
};
erhalte ich Kompilierungsfehlern auf die Wirkung von:
error C2555: 'CRTP<T>::clone': overriding virtual function return type differs and is not covariant from 'Base::clone'
Ich weiß, dies wahrscheinlich nicht vollständig ein Ergebnis des Compilers ist den Vererbungsbaum für Abgeleitet wenn Instanziieren CRTP zu kennen. Außerdem wird auch der Rückgabetyp (T *) durch (Base *) ersetzt. Ich würde jedoch gerne wissen, ob es eine Arbeit gibt, die die obige Semantik beibehält.
Für was es wert ist, geben GCC 4.1.2 und 4.7.1 beide ähnliche Fehler. –
Duplizieren von http://stackoverflow.com/questions/15570333/crtp-and-dynamic-polymorphism-compile-error – erikced
@erikced Danke für die Köpfe hoch. Es scheint, als ob ich nicht viel tun kann, ich werde nur den Rückgabetyp ersetzen. – Whanhee