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.

Añade un nuevo espacio de nombres en la API de forma compatible hacia atrás.

Hay una biblioteca con esta clase pública.

cpp
namespace lib {
class Class {};
}

Quiero refactorizarla y agregar un namespace más.

cpp
namespace lib::sublib {
class Class {};
}

Quiero hacerla compatible hacia atrás con la API, de modo que los clientes existentes de la biblioteca puedan compilar con la nueva versión de la biblioteca sin cambiar su código. Intenté agregar un alias.

cpp
namespace lib {
using Class [[deprecated]] = sublib::Class;
}

Esto funciona en la mayoría de los casos, excepto si los clientes de la biblioteca adelantan la declaración de lib::Class.

cpp
namespace lib {
class Class;
}

En este caso, hay un error sobre declaraciones en conflicto.: error: conflicting declaration ‘using Class = class lib::sublib::Class’
10 | using Class = sublib::Class;
| ^~~~~: note: previous declaration as ‘class lib::Class’
2 | class Class;
| ^~~~~

¿Hay alguna manera de agregar un nuevo namespace y no romper el código existente? Esta pregunta solo se refiere a la compatibilidad de la API. La compatibilidad hacia atrás del ABI no es necesaria.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, existe una forma de agregar un nuevo espacio de nombres sin romper el código existente. En lugar de utilizar un alias, se puede crear una nueva clase con el mismo nombre que la antigua y heredar de la nueva clase en la antigua, de la siguiente manera:

    namespace lib {
    class Class : public sublib::Class {};
    }
    

    De esta forma, los clientes de la biblioteca existente pueden seguir adelante con la declaración anticipada de lib::Class y utilizarla como antes, porque el nombre lib::Class sigue refiriéndose a la misma clase. Al mismo tiempo, el nuevo espacio de nombres lib::sublib está disponible para los clientes que deseen utilizar la nueva versión de la clase.

Comments are closed.