Este es el escenario:¿Cómo me refiero a una plantilla de clase, como plantilla, desde dentro de su propia definición de clase?
template <template <typename> class T, typename V>
struct parent {
void do_something();
};
template <typename V>
struct child : public parent<child, V> {
void do_something(V argument);
using parent<child, V>::do_something; // C3200: invalid template argument for template parameter 'IMPL', expected a class template
};
El código anterior falla al compilar en la línea determinada por el error dado (MSVC 9,0). Sin embargo si escribo esto en su lugar, fuera de la definición de clase para child
:
template <typename V>
struct parent_identity_meta {
typedef typename parent<child, V> type; // no error!
};
ahora puedo hacerlo con éxito el siguiente, dentro de child
:
using parent_identity_meta<V>::type::do_something;
Sé que hay una limitación (aliviado en C + +11) que no puede tipear def contra una plantilla, pero no creo que sea eso con lo que me estoy encontrando aquí, de lo contrario fallaría el typedef en parent_identity_meta
. Parece que child
se refiere a la plantilla cuando no está dentro de su propia definición de clase, y a la clase que se genera desde sí mismo.
Esto es bastante comprensible (tener que escribir child<V>
cada vez sería doloroso); pero ¿hay alguna manera de anular este comportamiento?
¿Has probado ':: child'? –
No puedo explicar el mensaje de error, pero noté que 'do_something' es privado. Creo que eso también es un problema. – jogojapan
@SethCarnegie: Eso lo arregla para mí. Aunque no estoy seguro de por qué. Ooh, en realidad creo que lo entiendo (: – Mankarse