我对这段代码有一个问题:
#include <boost/multi_array.hpp>
#include <boost/array.hpp>
#include <vector>
#include <iostream>
template <typename Vec>
void foo(Vec& x, size_t N)
{
for (size_t i = 0; i < N; ++i) {
x[i] = i;
}
}
int main()
{
std::vector<double> v1(10);
foo(v1, 5);
std::cout << v1[4] << std::endl;
boost::multi_array<double, 2> m1;
boost::array<double, 2> shape;
shape[0] = 10;
shape[1] = 10;
m1.resize(shape);
foo(m1[0], 5);
std::cout << m1[0][4] << std::endl;
return 0;
}
字符串
尝试用gcc编译它,我得到错误:
boost_multi_array.cpp: In function 'int main()':
boost_multi_array.cpp:26: error: invalid initialization of non-const reference of type 'boost::detail::multi_array::sub_array<double, 1u>&' from a temporary of type 'boost::detail::multi_array::sub_array<double, 1u>'
boost_multi_array.cpp:7: error: in passing argument 1 of 'void foo(Vec&, size_t) [with Vec = boost::detail::multi_array::sub_array<double, 1u>]'
型
当我将函数foo
的第一个参数的类型从Vec&
更改为Vec
时,它可以像boost::multi_array预期的那样工作,但是随后std::vector通过值传递,这不是我想要的。我如何才能在不编写两个模板的情况下实现我的目标?
2条答案
按热度按时间cngwdvgl1#
问题是对于 NumDims > 1,
operator[]
返回一个template subarray<NumDims-1>::type
类型的临时对象。一个(不太好的)解决方法是这样的:
字符串
另一种方法是 Package 您的实现并为多数组情况提供重载.例如:
boost::multi_array<T,N>::reference
一起工作,请不要在这个detail::
版本中投入生产使用;)*型
0vvn1miw2#
解决方案(对于现代来说)应该很容易,可以普遍参考:
字符串
既然你已经在做了,那就让实现更正确(向前),返回一些有用的东西,并给它起个好名字:
型