Re: dllexport vs. template + inheritance
Imre wrote:
I have some problems with dll-exporting classes that are derived from
template instances. It seems that if a class derived from a template
class instance is exported, then the compiler wants to explicitly
instantiate the whole template (including all member functions), while
if the derived class is not exported, then only the class declaration
is instantiated.
Hmmm, what do you mean with "class declaration is instantiated"?
// --- DllDerived.h ---
[...]
class __declspec(dllexport) DllDerived:
public DllTemplate<int>
{
};
// --- DllDerived.cpp ---
[...]
template class __declspec(dllexport) DllTemplate<int>;
Hmmm, here, you explicitly tell the compiler that it should export
DllTemplate<int>, so what surprises you here?
Anyhow, there is indeed a problem with the compiler/linker: if you
DLL-export a type that is derived from e.g. std::pair<x,y>, several of
pair's members are exported, too, leading to linker errors if another
definition of these functions is found anywhere, e.g. in another DLL that
exports a type that is also derived from pair<x,y> or if you have a
translation unit that uses pair<x,y> but without the DLL-exported type
being in scope. This is also the workaround for some cases, simply
including the header that then tells the compiler to import pair<x,y> from
the DLL.
Uli