提升multi_array范围编译

YXD*_*YXD 5 c++ boost boost-multi-array multidimensional-array

范围可用于切片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;
}
Run Code Online (Sandbox Code Playgroud)

编译器输出是:

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>()’
Run Code Online (Sandbox Code Playgroud)

知道如何编译这个,或者缺少什么?

ild*_*arn 5

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

boost::multi_array_types::index_range::index类型最终归结为typedef std::ptrdiff_t; 鉴于你提供的int文字,显然是你的平台/配置,std::ptrdiff_t是某种类型的typedef int(根据你的错误消息long).

便携式修复是将您的文字强制为正确的类型:

#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();
}
Run Code Online (Sandbox Code Playgroud)