【发布时间】:2016-11-01 09:30:56
【问题描述】:
我正在尝试更多地了解如何在实践中使用 C++ 常量表达式,并创建了以下 Matrix 类模板用于说明目的:
#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_{};
};
这个想法是有一个简单的 Matrix 类,我可以在编译时使用它来计算小矩阵来评估 Matrix 表达式(请注意,我还没有实现用于加法和乘法的常用 Matrix 运算符)。
当我尝试如下初始化一个 Matrix 实例时:
constexpr std::array<double, 4> a = {1,1,1,1};
constexpr Matrix<double, 2, 2> m(a);
我从编译器 (MS Visual C++ 14) 收到以下错误:
error: C2127: 'm': illegal initialization of 'constexpr' entity with a non-constant expression
请注意我做错了什么......任何帮助完成这项工作将不胜感激!
【问题讨论】:
-
也许
std::array没有 constexpr 复制构造函数? -
去掉析构函数的定义
-
作为旁注,没有必要将
numrows_和numcols_存储为成员变量。由于您已经将这些值作为模板参数,因此只需返回这些值。 -
@Piotr Skotnicki 是的,成功了。谢谢!如果您将此作为答案发布,我会接受。但是我不明白为什么定义析构函数会触发错误?
-
@nasser-sh 正如建议的那样,我通过删除行和列大小的不必要成员变量来清理代码
标签: c++ c++11 visual-c++ constexpr