So erstellen Sie typedef für `boost :: array_view" in einer Vorlagenklasse
-
23-12-2019 - |
Frage
Ich möchte eine dimensionsunabhängige Vorlage haben (nützlich sowohl für 3D als auch für 4d), die meisten Operationen werden an Submatrizen ausgeführt, wobei die erste Dimension entfernt wird.
Also hier ist was ich gerne hätte
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;
};
Wo array_type
definiert ein Array, das von dieser Klasse verwaltet wird index_type
definiert den Typ, der zum Indizieren von Arrays verwendet wird, und ich möchte `stride_type
um ein Segment dieses Arrays mit einer Dimension weniger zu definieren.
Im Moment bekomme ich eine Fehlermeldung:
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;
^
Lösung
Von der Dokumentation in Ansichten sehen Sie die Definition des Ansichtstyps als:
typedef typename Array::template array_view<3>::type view1_t;
das macht also Ihren Code kompilieren:
#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;
}
Sie müssen angeben, dass die array_view
ist eigentlich ein klassenvorlage um es als solches zu benutzen.Andernfalls erwartet der Compiler, dass es sich um einen vollständig definierten Typ handelt.
Andere Tipps
Du brauchst typename
und/oder .template
qualifizierung nach abhängigen Namen:
typedef typename array_type::array_view<dimensions-1>::type stride_type;
Wenn Sie ein Vorlagenmitglied für einen abhängigen Namen verwenden, benötigen Sie .template
Qualifikation:
obj.template foo<T>();
Sehen Sie diese sehr beliebte Antwort für den Hintergrund