U
Unknownmat
Hello,
I am using Visual Studio 2005 (msvc 8.0, I believe). I am experience
some unexpected compiler warnings that have to do with how integer
types, size_t, and boost interact. I hope that somebody on this list
might know what's going on.
Here is the smallest code I could come up with to reproduce the
behavior:
#include <vector>
#include <functional>
#include <boost/function.hpp>
template< class T >
void test()
{
typedef std::vector< T > TItems;
typedef boost::function< bool (T, T) > TCompFn;
typedef std::vector< std::size_t > TSizes;
TItems data;
TCompFn fn = TCompFn( std::greater< T >() );
fn( data.front(), data.front() ); // NOTE: data is empty - will
cause a runtime error if run
}
int main()
{
test< int >();
test< unsigned >();
}
When I compile this, I get the following warning about the line
"fn( data.front(), data.front() );":
warning C4267: 'argument' : conversion from 'size_t' to 'unsigned
int', possible loss of data
This warning will go away when I do any of the following:
- Comment out EITHER line in the main function.
- Use a 'naked' std::greater< T >, rather than a boost::function<
bool (T, T) >
- comment out the typedef std::vector< std::size_t > TSizes;
I thought that size_t was distinct form the various integer types -
and the compiler warning seems to confirm this - but based on the fact
that commenting out the vector< size_t> typedef removes the warning,
this typedef seems to be stepping on my earlier vector< T > typedef.
Based on the fact that using greater< T > instead of function< bool
(T,T) > fixes the problem -- I wonder if some boost size_t definition
somehow steps on std::size_t?
And finally, I'm completely stumped why commenting out either line in
main() 'fixes' the problem.
Anyway, thanks for your time, any help would be appreciated.
Matt
I am using Visual Studio 2005 (msvc 8.0, I believe). I am experience
some unexpected compiler warnings that have to do with how integer
types, size_t, and boost interact. I hope that somebody on this list
might know what's going on.
Here is the smallest code I could come up with to reproduce the
behavior:
#include <vector>
#include <functional>
#include <boost/function.hpp>
template< class T >
void test()
{
typedef std::vector< T > TItems;
typedef boost::function< bool (T, T) > TCompFn;
typedef std::vector< std::size_t > TSizes;
TItems data;
TCompFn fn = TCompFn( std::greater< T >() );
fn( data.front(), data.front() ); // NOTE: data is empty - will
cause a runtime error if run
}
int main()
{
test< int >();
test< unsigned >();
}
When I compile this, I get the following warning about the line
"fn( data.front(), data.front() );":
warning C4267: 'argument' : conversion from 'size_t' to 'unsigned
int', possible loss of data
This warning will go away when I do any of the following:
- Comment out EITHER line in the main function.
- Use a 'naked' std::greater< T >, rather than a boost::function<
bool (T, T) >
- comment out the typedef std::vector< std::size_t > TSizes;
I thought that size_t was distinct form the various integer types -
and the compiler warning seems to confirm this - but based on the fact
that commenting out the vector< size_t> typedef removes the warning,
this typedef seems to be stepping on my earlier vector< T > typedef.
Based on the fact that using greater< T > instead of function< bool
(T,T) > fixes the problem -- I wonder if some boost size_t definition
somehow steps on std::size_t?
And finally, I'm completely stumped why commenting out either line in
main() 'fixes' the problem.
Anyway, thanks for your time, any help would be appreciated.
Matt