Boost logo

Boost :

From: Sean Parent (sparent_at_[hidden])
Date: 2001-12-04 01:36:14


I ran into the following problem with array_traits.hpp (boost 1.26.0) and
CodeWarrior 7.0 (stock compilers - this code is distilled for this bug
report). Compiling this code causes the IDE to exit with an internal
compiler error:

---
#include <iostream>
#include <boost/array_traits.hpp>
template <typename R>
typename boost::array_traits<R>::iterator get_end(R& range)
    {
    return boost::end(range);
    }
int main()
    {
    int array[] = { 0, 1, 2, 3, 4, 5 };
    std::cout << *(get_end(array) - 1) << std::endl;
    return 0;
    }
---
The problem appears to be in the array_traits specializations for arrays
(both const and non-const when the size is taken. That, combined with the
reference in get_end(R&) and boom.
The workaround I found was to change how size is taken:
template <typename T>
inline int array_size(T(&))
    {
    return sizeof(T) / sizeof((*((T*)(0)))[0]);
    }
// In array_traits<T[sz]>
      static iterator end(T (&array)[sz])
        { return array + array_size(array); }
      static size_type size(T (&array)[sz])
        { return array_size(array); }
// In array_traits<T const[sz]>
      static iterator end(T const (&array)[sz])
        { return array + array_size(array); }
      static size_type size(T const (&array)[sz])
        { return array_size(array); }
This inline for array_size() will also work on VC++. It may be useful in
trying to do an array_traits that works with VC++.
Sean
-- 
Sean Parent
Sr. Computer Scientist II
Advanced Technology Group
Adobe Systems Incorporated
sparent_at_[hidden]

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk