【问题标题】:Boost multi_array range compilation提升 multi_array 范围编译
【发布时间】:2011-09-30 12:39:23
【问题描述】:

范围可用于对 Boost 多维数组 (multi_array) 进行切片。根据documentation,有几种定义范围的方法,但并非所有方法都能编译。我在 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>()’

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

【问题讨论】:

  • 您是否尝试过显式注入整个命名空间(即using boost::deail::multi_array)?这是似乎定义了运算符的地方,但是可能由于您的编译器 ADL 失败(例如,ideone 编译了上述内容)。
  • 试过using namespace boost::detail::multi_array,我仍然得到错误...
  • dpgk 表示版本 1.42.0。在changelog 中看不到任何相关的tickets 或任何内容。
  • 奇怪,刚刚ssh'ed到另一台机器,它在那里编译。目前正在检查那里有什么不同。
  • 顺便说一句。 1.42。未通过 4.5.2 认证 - 因此可能存在一些问题,只有 1.46 通过 4.5.2 认证

标签: c++ boost multidimensional-array boost-multi-array


【解决方案1】:

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

boost::multi_array_types::index_range::index 类型最终归结为 std::ptrdiff_t 的 typedef;鉴于您提供 int 文字,显然是针对您的平台/配置,std::ptrdiff_t 是除 int 之外的某种类型的 typedef(根据您的错误消息,它是 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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-19
    • 2013-03-22
    • 1970-01-01
    • 2015-06-05
    • 2015-04-12
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多