Проблема в том, что для NumDims> 1 , operator[]
возвращает временный объект типа template subarray<NumDims-1>::type
.
Обходной (не очень приятный) будет примерно такой:
typedef boost::multi_array<double, 2> MA;
MA m1;
MA::reference ref = m1[0];
foo(ref, 5); // ref is no temporary now
Альтернативой может быть обернуть вашу реализацию и обеспечить перегрузку для случая с несколькими массивами .... Например: 1011
(примечание: я не видел, как заставить перегрузку работать с boost::multi_array<T,N>::reference
, пожалуйста, не используйте ее продуктивно с этой detail::
версией;)
template<class T>
void foo_impl(T x, size_t N) {
for (size_t i = 0; i < N; ++i) {
x[i] = i;
}
}
template<class T>
void foo(T& t, size_t n) {
foo_impl<T&>(t, n);
}
template<typename T, size_t size>
void foo(boost::detail::multi_array::sub_array<T, size> r, size_t n) {
foo_impl(r, n);
}