usan una sirve que programacion para orientada objetos las interfaz interfaces ejemplos ejemplo derivada como clases clase atributos abstractas abstracta c++ dll

c++ - sirve - std:: vector necesita tener una interfaz dll para ser utilizada por los clientes de clase ''X<T> advertencia



para que sirve una clase abstracta (4)

Estoy intentando hacer que mi biblioteca sea exportable como una DLL, pero recibo muchas de estas advertencias para una clase específica que usa std :: vector:

template <typename T> class AGUI_CORE_DECLSPEC AguiEvent { typedef void (*AguiCallbackFptr)(T arg, AguiWidget* sender); std::vector<AguiCallbackFptr> events; public: void call(AguiWidget* sender, T arg) const; void addHandler(AguiCallbackFptr proc); void removeHandler(AguiCallbackFptr proc); void removeHandler(); AguiEvent(); };

Recibo advertencias como estas:

Advertencia 57 advertencia C4251: ''AguiEvent :: events'': class ''std :: vector <_Ty>'' necesita tener dll-interface para ser utilizado por los clientes de la clase ''AguiEvent''

Traté de encontrar cómo hacerlo correctamente, pero la documentación de MSDN es muy solo de Windows, y necesito que sea multiplataforma para que solo haga cosas específicas de MS cuando AGUI_CORE_DECLSPEC está definido.

¿Qué debo hacer para deshacerme de estas advertencias?

Gracias


El método habitual para tratar cosas específicas de la plataforma como esto es intentar restringir todas las configuraciones específicas de la plataforma a un puñado de archivos / clases de bajo nivel, y luego usar #defines y # ifdef / # ifndef preprocessor directives para agregar / reemplazar variaciones específicas de la plataforma .

Para implementar esto de manera efectiva, es posible que necesite una capa de abstracción. Por ejemplo, un sistema de producción en el que trabajé en la década de 1990 tenía una biblioteca de "Sistema de archivos". Esto presentaba una interfaz común para las aplicaciones y el código de producción, pero tenía que depender de unos pocos archivos específicos de la plataforma. Además de facilitar la compilación y el mantenimiento, también facilitó el acceso a nuevas plataformas. ¿Un nuevo proveedor de hardware de archivos o sabor de sistema operativo? Simplemente agregue las configuraciones a los archivos de inclusión y agregue nuevas directivas en consecuencia.


La exportación desde una DLL es específica de la plataforma. Deberá corregir esto para Windows (básicamente use declspec(dllexport/dllimport) en la plantilla de clase instanciada) y encapsule el código requerido en su macro de preprocesador específica de Windows.

Mi experiencia es que exportar clases de STL desde archivos DLL en Windows está plagado de problemas, generalmente trato de diseñar la interfaz de manera que no sea necesaria.


Simplemente podría exportar los miembros, a los cuales los clientes dll necesitan acceder. Para hacerlo, elimine la declaración de exportación de la declaración de clase y agréguela a cada función miembro individual que desee exportar.

EDITAR:

En su caso, probablemente no intente exportar la clase (deje fuera AGUI_CORE_DECLSPEC) ya que es una clase de plantilla. Proporcione todos los métodos en su encabezado como en línea y funcionará.

Si no quiere esto, algunos compiladores proporcionan una forma especial de exportar clases de plantilla. Pero deberá especificar el parámetro de la plantilla para esto.


Una solución es confiar en la asignación dinámica / desasignación de las estructuras STL. Asi que:

class EXPORTED ExportedClass { private: std::vector<int> *_integers; public: ExportedClass() { _integers = new std::vector<int>(); } ~ExportedClass() { delete _integers; } };

no dará ninguna advertencia y es más seguro en caso de que esté distribuyendo el mismo binario (el dll) que debe usarse con una versión diferente del compilador que puede tener diferentes versiones de STL. De esta forma, tienes garantía del 100% de que sizeof(ExportedClass) es siempre el mismo.