En C++ 0x, puede utilizar la palabra clave using
para heredar constructores, así:¿Los constructores heredados funcionan con plantillas en C++ 0x?
class B { B(int) {} };
class A : public B { using B::B; };
Qué va a declarar implícitamente una constructora A(int)
. Funciona esto con plantillas?
class B { B(int) {} };
template<class T> class A : public T { using T::T; };
Dentro T::T
, espero que el compilador para averiguar la mano izquierda T
ya que con el operador alcance de argumentos de plantilla es normal, pero tratar de calcular que la mano derecha T
es el constructor es un caso especial. De hecho, parece que hay una ambigüedad: ¿y si tengo un método llamado T
en B
que estoy tratando de agregar sobrecargas en A
(así es como un compilador interpretaría una declaración de uso previa a C++ 0x)?
sin que estaría bien porque 'nombretipo t' no representa un método llamado T representa un marcador de posición para el símbolo de tipo usado por la instanciación de la plantilla. Por ejemplo 'A' daría como resultado 'using int :: int; '... palabra de advertencia: ¿qué sucede con un tipo que no pretende ser una clase base como un contenedor STL? –
AJG85
Tiene razón en la pregunta variable de miembro. En cuanto a la herencia de un contenedor STL, funcionaría, pero estás en riesgo si usaras el tipo de forma polimórfica. Pero si simplemente está creando D>, y luego usarlo así en un solo lugar, entonces funcionaría. No es una buena práctica, pero funcionaría. –
Correcto pero definitivamente es algo a tener en cuenta ya que agregar estado al objeto derivado o utilizar punteros de clase base puede introducirse accidentalmente ya que la plantilla ofusca de algún modo la herencia y la causa raíz del problema más adelante. – AJG85