Boost logo

Boost Users :

From: Dave Dribin (dave-ml_at_[hidden])
Date: 2006-07-19 22:03:27


Hello,

This may be more appropriate for the devel list, but someone just
pointed out on this list that an endian library has been submitted
for approval. I've *just* needed classes like this (actually I wrote
my own similar classes), and decided to see how the Boost library
stacked up. It looks quite nice, and I'd be excited to see this
included. One suggestion I would make is that the endian classes
should not have constructors. As of version 0.5, trying to put them
into a union causes a compiler error. Take the struct from the
example, and add a union:

   struct header
   {
     big4_t file_code;
     big4_t file_length;
     little4_t version;
     little4_t shape_type;
     union
     {
         big4_t foo;
         little4_t bar;
     } baz;
   };

I get the following errors:

endian_example.cpp:37: error: member 'boost::integer::big4_t
<unnamed>::header::<anonymous union>::foo' with constructor not
allowed in union
endian_example.cpp:38: error: member 'boost::integer::little4_t
<unnamed>::header::<anonymous union>::bar' with constructor not
allowed in union

By removing all constructors, the errors go away. I cam across this
very issue when developing my classes, and found the answer in this
comp.lang.c++.moderated post:

  <http://groups.google.com/group/comp.lang.c++.moderated/msg/
103835a7b493723e?hl=en&>

As an experiment, I modified boost/integer/endian.hpp to remove the
constructors, and add an operator=() to see if this worked, and it did:

     template <typename T, std::size_t n_bytes>
     class endian< big, T, n_bytes, unaligned >
       : cover_operators< endian< big, T, n_bytes >, T >
     {
       public:
         typedef T value_type;
         operator T() const
           { return detail::load_big_endian<T, n_bytes>(bytes); }
         void operator=(T i) { detail::store_big_endian<T, n_bytes>
(bytes, i); }
       private:
           char bytes[n_bytes];
     };

I'd suggest making this change to all classes so that they can be
used in unions.

-Dave


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