Boost logo

Boost :

From: Robert Ramey (ramey_at_[hidden])
Date: 2004-11-22 17:15:51


This came about when I made some tweaks to get it to pass borland compilers.

I think my original intention was

operator const T () const {return t; } \
operator T & () { return t; } \

but maybe some compiler or other complained when T was a primitive type.
Honestly I don't remember now. I think that only a couple of compilers warn
about this.

Robert Ramey

"Jody Hagins" <jody-boost-011304_at_[hidden]> wrote in message
news:20041122165456.34f46069.jody-boost-011304_at_atdesk.com...
> On Mon, 22 Nov 2004 12:54:17 -0800
> "Robert Ramey" <ramey_at_[hidden]> wrote:
>
> > I've never really understood this warning - basically it reminds me
> > that I did what I intended to do.
>
>
> Are you always sure?
>
> bool
> basic_iarchive_impl::track(
> basic_iarchive & ar,
> void * & t
> ){
> object_id_type oid;
> load(ar, oid);
>
> // if its a reference to a old object
> if(object_id_type(object_id_vector.size()) > oid){
> // we're done
> t = object_id_vector[oid].address;
> return false;
> }
> return true;
> }
>
>
> object_id_vector is a std::vector<>, so it has...
>
> reference operator[](size_type n), where size_type is "unsigned int"
>
>
> The line that generates the warning wants to convert a "object_id_type"
> to a "unsigned int" so it can pass the index to operator[]().
>
> However, object_id_type is a class (BOOST_STRONG_DEF) with the following
> conversion operators...
>
>
> operator T () const {return t; } \
> operator T & () { return t; } \
>
>
> where T is "unsigned int"
>
> So, in the attempt to convert from object_id_type to "unsigned int", we
> try both of the operators, and they both match. So, the compiler can
> not decide which one you want, because your object is non-const. Maybe
> in this situation, it does not matter, but there are many situations in
> which this multiple match can cause harm.
>
> So, I think the warnings should be eliminated, to prevent a piece of
> "bad" use from being overlooked because we get used to seeing these
> warnings.
>
>
>
> The presence of both operators in the BOOST_STRONG_DEF is what causes
> this ambiguity...
>
>
> _______________________________________________
> Unsubscribe & other changes:
http://lists.boost.org/mailman/listinfo.cgi/boost
>


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk