Boost logo

Boost Users :

From: Lee Houghton (lee_at_[hidden])
Date: 2006-01-26 09:47:18


Note: I'm using boost 1.33.1 here

Sebastian Redl wrote:
> This code should really not give you any warnings. (And doesn't on
GCC, though I doubt that'll help you.)
> C4244, so that others don't have to look it up, is the "conversion
with possible data loss" warning. This indicates that in VC++,
make_counting_iterator returns a counting_iterator<long> or even
<__int64>. Can somebody with that compiler post the output of this line?
> std::cout << typeid(boost::make_counting_iterator(1)).name() <<
std::endl;

Using Visual Studio .NET 2003, the output of this was:

class boost::counting_iterator<int,struct boost::use_default,struct
boost::use_default>

as it should be.

> A simple workaround for this particular warning ought to be to
directly instantiate counting_iterators with their template parameter
set correctly.
>
> Sebastian Redl

The problem appears to be when operator += is called on the iterator.
Here, the difference_type of the iterator,
boost::iterator_facade<Derived,Value,CategoryOrTraversal,Reference,Difference>::difference_type,
which is equal to
boost::detail::counting_iterator_base<int,boost::use_default,boost::use_default>::difference,
is __int64. The counting_iterator_base uses the following typedef:

typedef typename detail::ia_dflt_help<
           Difference
         , mpl::eval_if<
               is_numeric<Incrementable>
             , numeric_difference<Incrementable>
             , iterator_difference<Incrementable>
>
>::type difference;

It seems this has been discovered before:
http://lists.boost.org/Archives/boost/2004/07/69347.php

The actual warnings I received compiling this code were:

--------------------------------------------------------

Compiling...
BoostTest1.cpp
d:\Program Files\Microsoft Visual Studio .NET
2003\Vc7\include\xutility(481) : warning C4244: '+=' : conversion from
'boost::iterators::enabled<__formal>::base<T>::type' to
'std::vector<_Ty>::size_type', possible loss of data
         with
         [
             __formal=true,

T=std::iterator_traits<boost::counting_iterator<int,boost::use_default,boost::use_default>>::difference_type
         ]
         and
         [
             _Ty=int
         ]
         d:\Program Files\Microsoft Visual Studio .NET
2003\Vc7\include\xutility(498) : see reference to function template
instantiation 'void std::_Distance2<_InIt,_Diff>(_RanIt,_RanIt,_Diff
&,std::random_access_iterator_tag)' being compiled
         with
         [

_InIt=boost::counting_iterator<int,boost::use_default,boost::use_default>,
             _Diff=std::vector<int>::size_type,

_RanIt=boost::counting_iterator<int,boost::use_default,boost::use_default>
         ]
         d:\Program Files\Microsoft Visual Studio .NET
2003\Vc7\include\vector(657) : see reference to function template
instantiation 'void
std::_Distance<_Iter,std::vector<_Ty>::size_type>(_InIt,_InIt,_Diff &)'
being compiled
         with
         [

_Iter=boost::counting_iterator<int,boost::use_default,boost::use_default>,
             _Ty=int,

_InIt=boost::counting_iterator<int,boost::use_default,boost::use_default>,
             _Diff=std::vector<int>::size_type
         ]
         d:\Program Files\Microsoft Visual Studio .NET
2003\Vc7\include\vector(634) : see reference to function template
instantiation 'void
std::vector<_Ty>::_Insert<_Iter>(std::vector<_Ty>::iterator,_Iter,_Iter,std::forward_iterator_tag)'
being compiled
         with
         [
             _Ty=int,

_Iter=boost::counting_iterator<int,boost::use_default,boost::use_default>
         ]
         d:\Program Files\Microsoft Visual Studio .NET
2003\Vc7\include\vector(366) : see reference to function template
instantiation 'void
std::vector<_Ty>::insert<_Iter>(std::vector<_Ty>::iterator,_Iter,_Iter)'
being compiled
         with
         [
             _Ty=int,

_Iter=boost::counting_iterator<int,boost::use_default,boost::use_default>
         ]
         d:\Program Files\Microsoft Visual Studio .NET
2003\Vc7\include\vector(343) : see reference to function template
instantiation 'void
std::vector<_Ty>::_Construct<_Iter>(_Iter,_Iter,std::input_iterator_tag)'
being compiled
         with
         [
             _Ty=int,

_Iter=boost::counting_iterator<int,boost::use_default,boost::use_default>
         ]
         g:\Projects\BoostTest1\BoostTest1.cpp(15) : see reference to
function template instantiation
'std::vector<_Ty>::vector<boost::counting_iterator<Incrementable,CategoryOrTraversal,Difference>>(_Iter,_Iter)'
being compiled
         with
         [
             _Ty=int,
             Incrementable=int,
             CategoryOrTraversal=boost::use_default,
             Difference=boost::use_default,
             _Iter
=boost::counting_iterator<int,boost::use_default,boost::use_default>
         ]
d:\Program Files\Microsoft Visual Studio .NET
2003\Vc7\include\boost\iterator\iterator_adaptor.hpp(329) : warning
C4244: '+=' : conversion from
'boost::iterator_facade<Derived,Value,CategoryOrTraversal,Reference,Difference>::difference_type'
to 'int', possible loss of data
         with
         [

Derived=boost::counting_iterator<int,boost::use_default,boost::use_default>,
             Value=const boost::mpl::identity<const int>::type,

CategoryOrTraversal=boost::mpl::identity<boost::random_access_traversal_tag>::type,
             Reference=boost::mpl::identity<const int &>::type,

Difference=boost::mpl::identity<boost::detail::counting_iterator_base<int,boost::use_default,boost::use_default>::difference>::type
         ]
         d:\Program Files\Microsoft Visual Studio .NET
2003\Vc7\include\boost\iterator\iterator_adaptor.hpp(327) : while
compiling class-template member function 'void
boost::iterator_adaptor<Derived,Base,Value,Traversal,Reference,Difference>::advance(boost::iterator_facade<Derived,Value,CategoryOrTraversal,Reference,Difference>::difference_type)'
         with
         [

Derived=boost::counting_iterator<int,boost::use_default,boost::use_default>,
             Base=int,
             Value=const int,

Traversal=boost::detail::counting_iterator_base<int,boost::use_default,boost::use_default>::traversal,
             Reference=const int &,

Difference=boost::detail::counting_iterator_base<int,boost::use_default,boost::use_default>::difference,

CategoryOrTraversal=boost::mpl::identity<boost::random_access_traversal_tag>::type
         ]
         d:\Program Files\Microsoft Visual Studio .NET
2003\Vc7\include\boost\iterator\counting_iterator.hpp(153) : see
reference to class template instantiation
'boost::iterator_adaptor<Derived,Base,Value,Traversal,Reference,Difference>'
being compiled
         with
         [

Derived=boost::counting_iterator<int,boost::use_default,boost::use_default>,
             Base=int,
             Val
ue=const int,

Traversal=boost::detail::counting_iterator_base<int,boost::use_default,boost::use_default>::traversal,
             Reference=const int &,

Difference=boost::detail::counting_iterator_base<int,boost::use_default,boost::use_default>::difference
         ]
         g:\Projects\BoostTest1\BoostTest1.cpp(12) : see reference to
class template instantiation
'boost::counting_iterator<Incrementable,CategoryOrTraversal,Difference>'
being compiled
         with
         [
             Incrementable=int,
             CategoryOrTraversal=boost::use_default,
             Difference=boost::use_default
         ]


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net