C++: Warning C4251: Templates en clases exportadas

Si uno tiene un template, sea de la STL o propio, como atributo en una clase exportada con __declspec(dllexport), nos salta este warning. El problema reside en que estamos exportando la declaración del template, sin su definición. Esto puede hacer que nuestro programa explote en tiempo de ejecución si combinamos binarios con diferentes versiones de la STL o de nuestro template. Esto puede ocurrir si usamos dll's compiladas con diferentes versiones del Visual Studio.

Si no podemos (o nos da fiaca) hacer refactoring para no exponer atributos en una clase exportada (idealmente, sólo deberíamos exportar interfaces), lo que podemos hacer es exportar no toda la clase sino sólo los métodos que se usan afuera. De forma genérica, si tenemos...

//Esto genera C4251
class __declspec(dllexport) A(){
public:
    A();
    virtual ~A();
    void f();
private:
    std::vector<int> m_vGeneraC4251;
}
... y el cliente de esta dll sólo necesita acceder a f (porque instancia A a través de una factory, ), podemos resolver el warning así:
class A(){
public:
    A();
    __declspec(dllexport) virtual ~A();
    __declspec(dllexport) void f();
private:
    std::vector<int> m_vGeneraC4251;
}

Comments

Popular posts from this blog

VB.NET: Raise base class events from a derived class

C++/CLI: Convert a String to BSTR or some other nasty stuff

Upgrading Lodash from 3.x to 4.x