Cómo crear typedef para ``boost::array_view`` en una clase con plantilla
-
23-12-2019 - |
Pregunta
Quiero tener una plantilla independiente de las dimensiones (útil tanto para 3D como para 4D), la mayoría de las operaciones se realizarán en submatrices con la primera dimensión eliminada.
Así que esto es lo que me gustaría tener.
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;
};
Dónde array_type
define una matriz administrada por esta clase index_type
define el tipo utilizado para indexar matrices, y me gustaría `stride_type
para definir una porción de esta matriz que tenga una dimensión menos.
Por ahora me sale un error:
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;
^
Solución
de la documentación enVistas, puede ver la definición del tipo de vista como:
typedef typename Array::template array_view<3>::type view1_t;
Entonces esto hace que su código compile:
#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;
}
Debe especificar que el GeneracDicetArgOde es en realidad una plantilla de clase para usarla como tal.De lo contrario, el compilador espera que sea un tipo completamente definido.
Otros consejos
Necesita typename
y / o generacodiCodeGode la calificación en los nombres dependientes:
typedef typename array_type::array_view<dimensions-1>::type stride_type;
Si está utilizando un miembro de plantilla en un nombre dependiente, necesita la calificación de .template
:
obj.template foo<T>();
Vea esta respuesta muy popular para el fondo