es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Clase derivada de std::ctype no compila para char.

El código a continuación no se compila con: anulación no anuló ningún método de la clase base y do_is no es un miembro de ctype.

Funciona bien para wchar_t.

Probado en VC++ 2022, configuraciones predeterminadas. [EDITAR] Obtengo el mismo resultado para GCC en línea. Parece que es una característica, pero ¿por qué?

“`cpp
#include <locale>

struct fail_t : std::ctype<char> // funciona para wchar_t
{
bool do_is(mask m, char_type c) const override
{
return ctype::do_is(m, c);
}
};

int main()
{
// nop
}
“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El código anterior define una estructura fail_t que es un subtipo de std::ctype<char>. Intenta sobrescribir el método do_is de la clase base std::ctype<char>, pero el compilador genera dos mensajes de error: override did not override any base class methods y do_is is not a member of ctype. Esto significa que el método do_is no está definido como un método virtual en la clase base y, por lo tanto, no se puede sobrescribir en las clases derivadas. Además, la clase ctype no tiene una función miembro llamada do_is, lo que provoca el segundo error.

    El código funciona bien para wchar_t porque la clase std::ctype<wchar_t> define do_is como un método virtual que se puede sobrescribir en clases derivadas. No está claro por qué la clase base para std::ctype<char> no tiene esta misma característica. Puede ser que sea intencional o puede ser una limitación de la implementación. Sin contexto adicional, es difícil decirlo con certeza.

Comments are closed.