Как создать typedef для « boost :: array_view« в шаблонном классе

Я хочу иметь шаблон с независимой размерностью (полезно как для 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;
^

2

Решение

От документация на представлениях вы можете увидеть определение типа представления как:

  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 на самом деле шаблон класса чтобы использовать его как таковой. В противном случае компилятор ожидает, что это будет полностью определенный тип.

3

Другие решения

Тебе нужно typename и / или .template уточнение по зависимым именам:

typedef typename array_type::array_view<dimensions-1>::type stride_type;

Если вы используете элемент шаблона с зависимым именем, вам нужно .template квалификация:

obj.template foo<T>();

Смотрите этот очень популярный ответ для фона

Где и почему я должен поставить "шаблон" а также "имяТипа" ключевые слова?

3

По вопросам рекламы [email protected]