Ich versuche, ein bisschen mehr auf lernen, wie C++ konstanten Ausdrücke in der Praxis und erstellt die folgende Matrix-Klasse-Vorlage zu Veranschaulichungszwecken verwenden:Warum beschwert sich der Compiler darüber, dass es kein Constexpr ist?
#include <array>
template <typename T, int numrows, int numcols>
class Matrix{
public:
using value_type = T;
constexpr Matrix() : {}
~Matrix(){}
constexpr Matrix(const std::array<T, numrows*numcols>& a) :
values_(a){}
constexpr Matrix(const Matrix& other) :
values_(other.values_){
}
constexpr const T& operator()(int row, int col) const {
return values_[row*numcols+col];
}
T& operator()(int row, int col){
return values_[row*numcols+col];
}
constexpr int rows() const {
return numrows;
}
constexpr int columns() const {
return numcols;
}
private:
std::array<T, numrows*numcols> values_{};
};
Die Idee ist, eine einfache Matrix-Klasse zu haben, was ich kann Verwenden Sie diese Option für kleine Matrizen, um Matrix-Ausdrücke zum Zeitpunkt der Kompilierung auszuwerten (beachten Sie, dass ich noch nicht die üblichen Matrix-Operatoren für Addition und Multiplikation implementiert habe).
Wenn ich versuche, eine Matrix-Instanz zu initialisieren, wie folgt:
constexpr std::array<double, 4> a = {1,1,1,1};
constexpr Matrix<double, 2, 2> m(a);
ich die folgende Fehlermeldung erhalten vom Compiler (MS Visual C++ 14):
error: C2127: 'm': illegal initialization of 'constexpr' entity with a non-constant expression
Hinweis sicher, was ich bin falsch machen ... jede Hilfe, um diese Arbeit zu machen, würde sehr geschätzt werden!
Vielleicht 'std :: array' keinen constexpr Copykonstruktor? –
Entfernen Sie die Definition des Destruktors –
Als Nebenbemerkung, es ist nicht notwendig, 'numrows_' und' numcols_' als Elementvariablen zu speichern. Da Sie die Werte bereits als Vorlagenparameter haben, geben Sie diese einfach zurück. –