Estoy intentando escribir una clase de host basada en políticas (es decir, una clase que hereda de su clase de plantilla), con un giro, donde la clase de política también está modelada por el clase de host, para que pueda acceder a sus tipos. Un ejemplo en el que esto podría ser útil es cuando una política (utilizada como mixin, en realidad) aumenta la clase de host con un método de clon polimórfico(). He aquí un ejemplo de un mínimo de lo que estoy tratando de hacer:Mezcla de diseño basado en políticas con CRTP en C++
template <template <class> class P>
struct Host : public P<Host<P> > {
typedef P<Host<P> > Base;
typedef Host* HostPtr;
Host(const Base& p) : Base(p) {}
};
template <class H>
struct Policy {
typedef typename H::HostPtr Hptr;
Hptr clone() const {
return Hptr(new H((Hptr)this));
}
};
Policy<Host<Policy> > p;
Host<Policy> h(p);
int main() {
return 0;
}
Esto, por desgracia, falla al compilar, en lo que parece a mí como tipo circular dependencia:
try.cpp: In instantiation of ‘Host<Policy>’:
try.cpp:10: instantiated from ‘Policy<Host<Policy> >’
try.cpp:16: instantiated from here
try.cpp:2: error: invalid use of incomplete type ‘struct Policy<Host<Policy> >’
try.cpp:9: error: declaration of ‘struct Policy<Host<Policy> >’
try.cpp: In constructor ‘Host<P>::Host(const P<Host<P> >&) [with P = Policy]’:
try.cpp:17: instantiated from here
try.cpp:5: error: type ‘Policy<Host<Policy> >’ is not a direct base of ‘Host<Policy>’
Si alguien puede detectar una error obvio, o ha mezclado con éxito CRTP en políticas, agradecería cualquier ayuda.