/*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
> 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
> 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
> 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.
> Rob.
I know that, but when you look at the manual:
http://www.sgi.com/tech/stl/bit_vector.html
>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().
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?
klaas...
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 ];
// ...
}
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