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
}
“`
davy.ai
El código anterior define una estructura
fail_t
que es un subtipo destd::ctype<char>
. Intenta sobrescribir el métododo_is
de la clase basestd::ctype<char>
, pero el compilador genera dos mensajes de error:override did not override any base class methods
ydo_is is not a member of ctype
. Esto significa que el métododo_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 clasectype
no tiene una función miembro llamadado_is
, lo que provoca el segundo error.El código funciona bien para
wchar_t
porque la clasestd::ctype<wchar_t>
definedo_is
como un método virtual que se puede sobrescribir en clases derivadas. No está claro por qué la clase base parastd::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.