|
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