vector<bool> special reference treatment?

K

klaas

the following code gives rise to the beneath error message, only when
a matrix object is instantiated as matrix<bool>, not with matrix<float>:

/*returns a reference to the object at position (Row,Col) in matrix*/
template <class num_type,template <class T> class functor>
num_type & matrix<num_type,functor >::eek:perator()(const int Row,const
int Col)
{if (Row<rows && Col<cols)
{vector<num_type> & x=matrix_core[Row];
//num_type & y=x[Col];<-is also faulty ,
//return matrix_core[Row][Col]; <- same problem
return x[Col];
}
// else return (*num_type)0;
}
indeed, matrix_core is of type vector<vector<num_type> >

apemonkie.cpp:27: instantiated from here
matrix.cpp:301: could not convert `std::vector<bool,
_Alloc>::eek:perator[](unsigned int) [with _Alloc =
std::allocator<bool>](Col)'
to `bool&'
make: *** [apemonkie.o] Error 1

I really do need a reference since I need to change values inside the
matrix.
STL-manual says that for a vector<T> foo;
the expression foo[bar]; should return a reference to an object of type T.
especially when you read the following, taken out of the bit_vector manual:
reference in "reference operator[](size_type n)"
A proxy class that acts as a reference to a single bit;
the reason it exists is to allow expressions like V[0] = true.
(A proxy class like this is necessary, because the C++ memory
model does not include independent addressing of objects smaller
than one byte.) The public member functions of reference are operator
bool() const, reference& operator=(bool), and void flip(). That is,
reference acts like an ordinary reference: you can convert a reference
to bool, assign a bool value through a reference, or flip the bit that
a reference refers to.


So it seems that there is special behavior for vector<bool> which sounds
reasonable (bit_vector is the same thing right), but how can I get the
references?

thanks in advance,

klaas
 
H

Howard Hinnant

klaas said:
So it seems that there is special behavior for vector<bool> which sounds
reasonable (bit_vector is the same thing right), but how can I get the
references?

Right, vector<bool> is special. It is "bit packed".

You can do this:

template <class num_type,template <class T> class functor>
typename std::vector<num_type>::reference
matrix<num_type,functor >::eek:perator()(const int Row,const int Col)
{
...
typename std::vector<num_type>::reference y = x[Col];
...
}

For every num_type but bool, reference will be num_type&. For bool it
will be a class that mostly acts like a real reference.

-Howard
 
R

Rob Williscroft

klaas wrote in
apemonkie.cpp:27: instantiated from here
matrix.cpp:301: could not convert `std::vector<bool,
_Alloc>::eek:perator[](unsigned int) [with _Alloc =
std::allocator<bool>](Col)'
to `bool&'
make: *** [apemonkie.o] Error 1

std::vector< bool > is a specialization, it actually packs
the bools into single bits and thus uses (size() / CHAR_BITS)
bytes of storage rather than size() bytes.

As a consiquence it's operator[] returns a proxy object since
its not possible to have a reference or pointer to a single bit.

Try changing your bool paramiter to char or write a class
that wraps up the functionality of a bool.

HTH

Rob.
 
K

klaas

and ESPECIALLY here:
That is,


the code should work right?
or would I have to change the return value to bool instead of bool &?
That would seem odd though, because then the assignment trough the
reference would not be totally valid?


Then you should try:

... matrix< T >::whatever_is_at_line_301()
{
typedef typename std::vector< T >::reference result_type;

result_type r = this->m_vectorT[ whatever ];

// ...
}


Rob.
No, that's just delaying finding a solution. I think it can't be
solved:(. The manual says that the proxy just offers an interfave to
assign a bool to the object refered to and that you can assign to a
bool. Nothing has been promised about adding a level of indirection to
that service, which is what returning a reference to a bool would amount
to.

I'd have to add a separate way of handeling matrices of booleans and
that is not within the scope of my project. I'll use integers instead.

thanks

klaas
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,996
Messages
2,570,238
Members
46,826
Latest member
robinsontor

Latest Threads

Top