Улучшенная компиляция диапазона нескольких массивов

Диапазон может использоваться для нарезки многомерного массива Boost (multi_array). Согласно документации, существует несколько способов определения диапазона, но не все из них будут компилироваться. Я использую GCC 4.5.2 на Ubuntu 11.04.

#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>()’

Любая идея, как я могу это скомпилировать, или чего не хватает?

1 ответ

Решение

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();
}
Другие вопросы по тегам