Я хочу иметь шаблон с независимой размерностью (полезно как для 3d, так и для 4d), большинство операций будет выполняться на подматрицах с удалением первого измерения.
Так вот что я хотел бы иметь
template <typename element, int dimensions>
class MMapMatrixTemplate{
public:
typedef boost::multi_array_ref<element, dimensions> array_type;
typedef std::array<size_t, dimensions> index_type;
typedef array_type::array_view<dimensions-1>::type stride_type;
};
куда array_type
определяет массив, которым управляет этот класс index_type
определяет тип, используемый для индексации массивов, и я хотел бы `stride_type
определить срез этого массива, имеющий на один размер меньше.
Сейчас я получаю ошибку:
include/MMapMatrix.hh:31:55: error: non-template ‘array_view’ used as template
typedef boost::multi_array_ref<element, dimensions>::array_view<dimensions-1>::type stride_type;
^
От документация на представлениях вы можете увидеть определение типа представления как:
typedef typename Array::template array_view<3>::type view1_t;
так что это делает ваш код скомпилированным:
#include "boost/multi_array.hpp"
template <typename element, int dimensions>
class MMapMatrixTemplate{
public:
typedef boost::multi_array_ref<element, dimensions> array_type;
typedef std::array<size_t, dimensions> index_type;
//typedef array_type::array_view<dimensions-1>::type stride_type;
typedef typename array_type::template array_view<dimensions-1>::type stride_type;
};
int main(int argc, const char *argv[])
{
typedef MMapMatrixTemplate<double, 4> matrix;
return 0;
}
Вы должны указать, что array_view
на самом деле шаблон класса чтобы использовать его как таковой. В противном случае компилятор ожидает, что это будет полностью определенный тип.
Тебе нужно typename
и / или .template
уточнение по зависимым именам:
typedef typename array_type::array_view<dimensions-1>::type stride_type;
Если вы используете элемент шаблона с зависимым именем, вам нужно .template
квалификация:
obj.template foo<T>();
Смотрите этот очень популярный ответ для фона