class A {
virtual A* foo() = 0;
};
template<class T>
class B : public A {
virtual T* foo() { return nullptr; }
};
class C : public B<C> {
};
Questa è un'implementazione semplificata per Possibility to mix composite pattern and curiously recurring template pattern. Ottengo il seguente errore:Errore di compilazione CRTP e polimorfismo dinamico
Return type of virtual function 'foo' is not covariant with the return type of the function it overrides ('C *' is not derived from 'A *')
provata su clang 3.0, GCC 4.7 e Visual Studio 2008.
Prima soluzione:
class C : public A, public B<C> {}
compila in Visual Studio con un avvertimento che B è già un figlio di A e fa non compilare in clang con errore iniziale.
Un'altra soluzione:
class D : public A {}
class C : public B<D> {}
risolve il problema incompletezza, ma io non riesco a capire quante istanze A avrò. L'intuizione mi dice che A è virtuale, quindi dovrebbe essercene solo uno.
Anche questa soluzione alternativa crea codice illeggibile.
Che cosa indica lo standard su questa situazione? Questo codice dovrebbe essere compilato? Se no, perché?
È sempre bene tenere a mente che 'C' è incompleto nella sua lista di basi. –