Re: C4251 warnings - how do I get rid of this?
On Sat, 12 Jan 2008 16:34:51 +0000, "2b|!2b==?" <user@domain.invalid>
wrote:
I am exporting some templated classes from a DLL (yes, I know ...).
Despite reading and implementing the solutions presented at the
following links:
http://unknownroad.com/rtfm/VisualStudio/warningC4251.html
http://support.microsoft.com/kb/q168958/
I am still getting the following (slightly cryptic warnings):
c:\program files\microsoft visual studio 8\vc\include\map(82) : warning
C4251: 'std::_Tmap_traits<_Kty,_Ty,_Pr,_Alloc,_Mfl>::comp' : struct
'std::less<_Ty>' needs to have dll-interface to be used by clients of
class 'std::_Tmap_traits<_Kty,_Ty,_Pr,_Alloc,_Mfl>'
with
[
_Kty=long,
_Ty=PoolManager::LoginParms,
_Pr=std::less,
_Alloc=std::allocator>,
_Mfl=false
]
and
[
_Ty=long
]
and
[
_Kty=long,
_Ty=PoolManager::LoginParms,
_Pr=std::less,
_Alloc=std::allocator>,
_Mfl=false
]
c:\test\PoolManager.h(96) : see reference to class template
instantiation 'std::map<_Kty,_Ty>' being compiled
with
[
_Kty=long,
_Ty=PoolManager::LoginParms
]
c:\program files\microsoft visual studio 8\vc\include\map(82) : warning
C4251: 'std::_Tree_nod<_Traits>::_Alnod' : class 'std::allocator<_Ty>'
needs to have dll-interface to be used by clients of class
'std::_Tree_nod<_Traits>'
with
[
_Traits=std::_Tmap_traits,std::allocator>,false>
]
and
[
_Ty=std::_Tree_nod,std::allocator>,false>>::_Node
]
and
[
_Traits=std::_Tmap_traits,std::allocator>,false>
]
c:\program files\microsoft visual studio 8\vc\include\map(82) : warning
C4251: 'std::_Tree_ptr<_Traits>::_Alptr' : class 'std::allocator<_Ty>'
needs to have dll-interface to be used by clients of class
'std::_Tree_ptr<_Traits>'
with
[
_Traits=std::_Tmap_traits,std::allocator>,false>
]
and
[
_Ty=std::_Tree_nod,std::allocator>,false>>::_Node *
]
and
[
_Traits=std::_Tmap_traits,std::allocator>,false>
]
c:\program files\microsoft visual studio 8\vc\include\map(82) : warning
C4251: 'std::_Tree_val<_Traits>::_Alval' : class 'std::allocator<_Ty>'
needs to have dll-interface to be used by clients of class
'std::_Tree_val<_Traits>'
with
[
_Traits=std::_Tmap_traits,std::allocator>,false>
]
and
[
_Ty=std::pair
]
and
[
_Traits=std::_Tmap_traits,std::allocator>,false>
]
Does anyone know how I can get rid of the warnings above (without
resorting to #pragma disable) ?
You will have to dllexport every specialization that is mentioned in the
warnings. Of course, since you're sharing C++ classes between modules, you
are pretty much committed to treating the situation like static linking, in
that you need to use the same compiler and compiler settings in every
module, plus you will need to link all the modules to the same CRT DLL.
Given all that, and assuming template static data is not an issue, there's
not a whole lot of benefit to dllexporting templates, just some minor code
size reduction. So IMO, #pragma warning(disable) (and not using dllexport
at all) is the first choice to solving this problem, and you don't have to
continually dllexport new specializations as you use them. Another
alternative is to create non-template classes for each specialization and
dllexport them. They would use the handle/body idiom to avoid the need to
dllexport template specializations.
--
Doug Harrison
Visual C++ MVP