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;
                                                   ^
War es hilfreich?

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

Wo und warum muss ich die Schlüsselwörter "Vorlage" und "Typname" einfügen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top