vector<bool> special reference treatment?

Discussion in 'C++' started by klaas, Aug 22, 2003.

  1. klaas

    klaas Guest

    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
     
    klaas, Aug 22, 2003
    #1
    1. Advertising

  2. In article <QIq1b.19906$tK5.2673473@zonnet-reader-1>,
    klaas <> 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 >::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
     
    Howard Hinnant, Aug 22, 2003
    #2
    1. Advertising

  3. 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>::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.
    --
    http://www.victim-prime.dsl.pipex.com/
     
    Rob Williscroft, Aug 22, 2003
    #3
  4. klaas

    klaas Guest


    >>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
     
    klaas, Aug 22, 2003
    #4
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Alex Vinokur

    vector<int> and vector<bool>

    Alex Vinokur, Jan 15, 2005, in forum: C++
    Replies:
    1
    Views:
    346
    Sharad Kala
    Jan 15, 2005
  2. Bo Peng
    Replies:
    8
    Views:
    422
    Bob Hairgrove
    Feb 1, 2006
  3. Replies:
    8
    Views:
    1,967
    Csaba
    Feb 18, 2006
  4. T.U.F.F.

    Special treatment on Netscape browsers (disadvantage)

    T.U.F.F., Apr 28, 2004, in forum: ASP .Net Web Services
    Replies:
    1
    Views:
    112
    Jan Tielens
    Apr 29, 2004
  5. A. Farber
    Replies:
    1
    Views:
    120
    Anno Siegel
    May 11, 2004
Loading...

Share This Page