5

范围可用于对 Boost 多维数组 (multi_array) 进行切片。根据文档,有几种定义范围的方法,但并非所有方法都能编译。我在 Ubuntu 11.04 上使用 GCC 4.5.2。

#include <boost/multi_array.hpp>

int main() {
    typedef boost::multi_array_types::index_range range;
    range a_range;   

    // indices i where 3 <= i

    // Does compile
    a_range = range().start(3);

    // Does not compile
    a_range = 3 <= range();
    a_range = 2 < range();

    return 0;
}

编译器输出为:

ma.cpp: In function ‘int main()’:
ma.cpp:9:26: error: no match for ‘operator<=’ in ‘3 <= boost::detail::multi_array::index_range<long int, long unsigned int>()’
ma.cpp:10:25: error: no match for ‘operator<’ in ‘2 < boost::detail::multi_array::index_range<long int, long unsigned int>()’

知道如何编译它,或者缺少什么吗?

4

1 回答 1

5

这里调用的operator<operator<=是模板;因此,为参数提供给所述运算符的值必须与所提供范围的模板参数的Index类型完全相同。Index

boost::multi_array_types::index_range::index类型最终归结为 typedef for std::ptrdiff_t; 鉴于您正在提供int文字,显然是针对您的平台/配置,是除(根据您的错误消息它是)std::ptrdiff_t之外的某种类型的 typedef 。intlong

可移植的解决方法是将您的文字强制转换为正确的类型:

#include <boost/multi_array.hpp>

int main()
{
    typedef boost::multi_array_types::index_range range;
    typedef range::index index;

    range a_range;
    a_range = index(3) <= range();
    a_range = index(2) < range();

    index i(1);
    a_range = i <= range();
}
于 2011-07-07T16:49:27.050 回答