class A
{
public:
virtual ~A()
{
}
};
class B : virtual public A
{
public:
~B() throw()
{}
};
class C : public B
{
};
int main(int argc, char * argv [])
{
return 0;
}
Ese código da el siguiente error:especificación de excepción de gcc destructor predeterminado
error: looser throw specifier for ‘virtual C::~C()’
error: overriding ‘virtual B::~B() throw()’
en mi Debian Testing (gcc (Debian 4.6.0-10) 4.6.1 20110526 (preliminar)), pero compila sin errores en versiones anteriores de gcc (4.5 en mi sistema Debian nuevamente).
How does an exception specification affect virtual destructor overriding? De acuerdo con esa respuesta, el compilador debe crear un constructor predeterminado que coincida con la declaración throw de la clase base. Obviamente, esto no es lo que sucede en el nuevo gcc. ¿Qué ha cambiado? ¿Cuál es el comportamiento correcto del compilador? ¿Existe alguna solución fácil al problema que no sea la adición manual de destructores vacíos en las clases derivadas (indicador del compilador, por ejemplo)?
¿Es ese el código real? Si omitió una declaración de miembro, eso puede cambiar el resultado. Además, ¿especificó compatibilidad con C++ 11? Las reglas han cambiado un poco destructores wrt y, aunque el código aún debería estar bien, podría haber un error en algún lugar allí. –
No, ese no es el código real. Puedo decirlo porque tiene al menos un error de sintaxis. @Yordan, publique un código real y compilable cuando haga una pregunta. Para obtener detalles sobre cómo hacerlo y por qué es importante, visite http://sscce.org. –
@Rob - O.o Tienes que estar bromeando ..?No es una pregunta con un código fuente complicado y largo, donde tales cosas son importantes. Faltan dos puntos y coma obvios, esto no cambia la pregunta, la información, el entorno, nada. –