Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 高度不是一个恒定的表达式_C++_C++11 - Fatal编程技术网

C++ 高度不是一个恒定的表达式

C++ 高度不是一个恒定的表达式,c++,c++11,C++,C++11,如何在构造函数中为2D数组分配动态内存,同时保持我的std::unique_ptr处理其释放?还是有更好的方法 我的错误是“高度不是一个恒定的表达式” #包括 #包括 #包括 模板 类矩阵 { 私人: int宽度、高度; std::唯一的ptr元素; 公众: 矩阵(整数宽度、整数高度); T*运算符[](整数索引); 常量T*运算符[](整数索引)常量; }; 模板 矩阵::矩阵(int-Width,int-Height):宽度(Width),高度(Height),元素(新的T[Width][H

如何在构造函数中为2D数组分配动态内存,同时保持我的
std::unique_ptr
处理其释放?还是有更好的方法

我的错误是“高度不是一个恒定的表达式”

#包括
#包括
#包括
模板
类矩阵
{
私人:
int宽度、高度;
std::唯一的ptr元素;
公众:
矩阵(整数宽度、整数高度);
T*运算符[](整数索引);
常量T*运算符[](整数索引)常量;
};
模板
矩阵::矩阵(int-Width,int-Height):宽度(Width),高度(Height),元素(新的T[Width][Height]){}
模板
T*矩阵::运算符[](int-Index){返回元素[Index];}
int main()
{
矩阵M(4,4);

std::cout您需要使用动态数组习惯用法。分配一个一维向量并转换坐标。类似于:
,元素(新的T[Width*Height])
。然后您需要在运算符[]中执行数组转换,类似于:
返回元素。get()+Index*Height;


顺便说一句,您的
unique\u ptr
应该是
unique\u ptr
而不是
T*
。如果您使用
new[]
进行分配,您需要
unique\u ptr
来确保使用
delete[]回收它

您需要使用动态数组习惯用法。分配一个一维向量并转换坐标。类似于:
,元素(新的T[Width*Height])
。然后您需要在运算符[]中执行数组转换,类似于:
返回元素。get()+Index*Height;


顺便说一句,您的
unique\u ptr
应该是
unique\u ptr
而不是
T*
。如果您使用
new[]
进行分配,您需要
unique\u ptr
来确保使用
delete[]回收它

函数参数不能用于初始化C数组,因为它们的值在编译时不一定是已知的。另外,像您这样执行动态分配的矩阵类也不是一个好主意……我建议将维度作为矩阵类模板的一部分,类似这样

template<typename T, size_t Width, size_t Height>
class Matrix
{
    private:
        std::array<std::array<T, Height>, Width> Elements;

    public:
        Matrix() {}

        std::array<T, Height> & operator[](int Index) { return Elements[Index]; }
};

函数参数不能用于初始化C数组,因为它们的值在编译时不一定是已知的。另外,像您这样执行动态分配的矩阵类也不是一个好主意…我建议将维度作为矩阵类模板的一部分,类似这样

template<typename T, size_t Width, size_t Height>
class Matrix
{
    private:
        std::array<std::array<T, Height>, Width> Elements;

    public:
        Matrix() {}

        std::array<T, Height> & operator[](int Index) { return Elements[Index]; }
};

是的,但vector跟踪每一行,因此,如果用户决定调整一行大小而不调整其他行,则允许使用奇怪的矩阵。因此,我使用了普通数组:DYeah,但vector跟踪每一行,因此,如果用户决定调整一行大小而不调整其他行,则允许使用奇怪的矩阵。因此,我使用了普通数组:D
typedef Matrix<float, 2, 2> Mat2x2;
typedef Matrix<float, 3, 3> Mat3x3;