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;
                                                   ^
¿Fue útil?

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

¿Dónde y por qué tengo que poner las palabras clave "plantilla" y "typename"?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top