Re: C4267 with std::deque<size_t> by gast128
gast128
Mon Jul 24 04:10:37 CDT 2006
Hello Alex,
I think I did a typedef myself (e.g. typedef unsigned int bla_t;
std::deque<bla_t> bla;) and then it did not warn. To make it even more
strange is that leaving out the bool vector or adding an extra deque
for unsigned int types it didn't warn either.
But I can leave it. Disabling the warning is not as easy as it seems,
since in the precompiled header we already include the vector. And
disabling the warning for all vector operations is -as we call it in
Dutch- 'killing a mosguito with a canon'.
Wkr (and thx),
me
Alex Blekhman schreef:
> <gast128@hotmail.com> wrote:
> > Dear all,
> >
> > we have encountered a very strange warning in a very
> > specific contex:
> > using a std::deque with size_t on VStudio 2003, warning
> > level 4 and an
> > exported bool vector, i.e.:
> >
> > //1.cpp
> >
> > #include <deque>
> >
> > #define CLASS_EXPORT __declspec(dllexport)
> >
> > //for explicit (DLL) instantiation of vector's:
> > #pragma warning(push)
> > #pragma warning(disable: 4251)
> > //warning C4251: ... needs to have dll-interface to be
> > used by clients,
> > (TODO: can be dangerous however)
> > #include <vector>
> > #pragma warning(pop)
> >
> > //explicit (DLL) instantiation
> > template class CLASS_EXPORT std::vector<bool>;
> >
> >
> > int main()
> > {
> > //std::deque<unsigned> tmp1;
> > std::deque<size_t> tmp;
> >
> > tmp.resize(3);
> >
> > return 0;
> > }
> >
> > A compiler bug I presume?
>
>
> Not exactly. I'd call it compiler peculiarity. I can
> reproduce it with VC2005, as well. Explicit instantiation of
> std::vector<bool> is enough to trigger the C4267 warning. I
> don't know why instantiation of std::vector<bool> triggered
> this, however I have explanation to C4267 warning.
>
> C4267 warns that `size_t' being converted to `unsigned int'.
> It's 64-bit compatibility warning. Under 64-bit Windows
> `size_t' is 64 bits while `unsigned int' is still 32 bits.
> However, under 32-bit Windows `size_t' is typedef'ed as
> `unsigned int'. I think that when std::deque<size_t> is
> instantiated, then it happens in two stages (or more) where
> one stage already recognizes `size_t' as `unsigned int',
> while other still sees `size_t'. So, in one place it's
> already `unsigned int' and in the other it's `size_t'.
> Compiler cannot predict that in all places it will become
> appropriate size type eventually, hence it warns.
>
> As a quick solution you can disable Win64 portability issues
> detection (/Wp64 flag) for the project. Alternatively you
> can disable C4267 warning explicitly:
>
> #pragma warning(disable: 4267)
> #include <vector>
> #pragma warning(default: 4267)
>
>
> HTH
> Alex