Улучшенная компиляция диапазона нескольких массивов
Диапазон может использоваться для нарезки многомерного массива 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();
}