By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,146 Members | 1,385 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,146 IT Pros & Developers. It's quick & easy.

vector<bool> special reference treatment?

P: n/a
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 >::operator()(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>::operator[](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

Jul 19 '05 #1
Share this Question
Share on Google+
3 Replies


P: n/a
In article <QIq1b.19906$tK5.2673473@zonnet-reader-1>,
klaas <ja*@zonnet.ru> wrote:
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 >::operator()(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
Jul 19 '05 #2

P: n/a
klaas wrote in news:QIq1b.19906$tK5.2673473@zonnet-reader-1:
apemonkie.cpp:27: instantiated from here
matrix.cpp:301: could not convert `std::vector<bool,
_Alloc>::operator[](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.
--
http://www.victim-prime.dsl.pipex.com/
Jul 19 '05 #3

P: n/a
and ESPECIALLY here:
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.


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

Jul 19 '05 #4

This discussion thread is closed

Replies have been disabled for this discussion.