C++ C++;:构造函数没有匹配的函数调用?

C++ C++;:构造函数没有匹配的函数调用?,c++,constructor,syntax-error,C++,Constructor,Syntax Error,下面是我正在使用的构造函数的声明: _Task Multiplier { int **Z; int **X; int **Y; int xr, xcols_yrows, yc; void main() { for( int i = 0; i < xcols_yrows; i++ ) { matrixmultiply(Z, X, xr, i, Y, yc); } } public:

下面是我正在使用的构造函数的声明:

_Task Multiplier {
    int **Z;
    int **X;
    int **Y;
    int xr, xcols_yrows, yc;
    void main() {
        for( int i = 0; i < xcols_yrows; i++ ) {
            matrixmultiply(Z, X, xr, i, Y, yc);
        }
    }

  public:
    Multiplier( int *Z[], int *X[], int *Y[], int xr, int xcols_yrows, int yc) :
        Z( Z ), X( X ), Y( Y ), xr( xr ), xcols_yrows( xcols_yrows ), yc( yc ) {}

};

参数声明
int*Z[]
指定指向整数的指针数组。成员声明
int**Z
指定指向指针(或其数组)的指针。参数类型
intx[xrows][xcols\u yrows]
是一个完全没有指针的多维数组

此外,分配的存储在堆栈上,在
return
语句之后,它将消失。由于乘法器对象分配了
new
,因此该数组应该具有类似的生存期。该数组可能应该由
Multiplier::Multiplier
中的
new
分配,或者在任何情况下都应该由
唯一的\u ptr
自动\u ptr
对象管理

第一个问题有几种解决方案:

  • 使用模板化构造函数,该构造函数在编译时检测数组的维度
  • 使用
    new
    calloc
    分配的指针数组
  • 分配一个一维数组并以多维方式使用它

  • 参数声明
    int*Z[]
    指定指向整数的指针数组。成员声明
    int**Z
    指定指向指针(或其数组)的指针。参数类型
    intx[xrows][xcols\u yrows]
    是一个完全没有指针的多维数组

    此外,分配的存储在堆栈上,在
    return
    语句之后,它将消失。由于乘法器对象分配了
    new
    ,因此该数组应该具有类似的生存期。该数组可能应该由
    Multiplier::Multiplier
    中的
    new
    分配,或者在任何情况下都应该由
    唯一的\u ptr
    自动\u ptr
    对象管理

    第一个问题有几种解决方案:

  • 使用模板化构造函数,该构造函数在编译时检测数组的维度
  • 使用
    new
    calloc
    分配的指针数组
  • 分配一个一维数组并以多维方式使用它

  • 问题在于,函数参数
    X
    Y
    Z
    基本上都需要指向int的
    指针数组,但您给它一个指向int
    数组的
    指针

    将参数指定为数组(用
    []
    声明)会衰减为将参数声明为指针。这是可以的,因为数组变量基本上可以被视为指向数组第一个元素的指针

    但是,这对于n维数组无效,因为编译器需要知道数组沿第二维的宽度,以便计算沿第一维的下一个元素的开始。。。也就是说,为了知道
    X[1][0]
    所指的内存位置,编译器需要知道
    X[0]
    中有多少元素

    一种解决方案是使用指向每个矩阵开头的指针,自己进行地址计算。例如:

    Multiplier( int *Z, int *X, int *Y, int xr, int xcols_yrows, int yc) :
        Z( Z ), X( X ), Y( Y ), xr( xr ), xcols_yrows( xcols_yrows ), yc( yc ) {}
    // ...
    multipliers[r] = new Multiplier( &Z[0][0], &X[0][0], &Y[0][0], r, xcols_yrows, ycols );
    

    并且知道调用代码中的
    X[i][j]
    实际上是
    X[i*xcols\u yrows+j]
    内部的
    乘法器
    问题是函数参数
    X
    Y
    Z
    基本上需要一个指向int的
    指针数组,但是你给它一个
    指针,指向int的数组

    将参数指定为数组(用
    []
    声明)会衰减为将参数声明为指针。这是可以的,因为数组变量基本上可以被视为指向数组第一个元素的指针

    但是,这对于n维数组无效,因为编译器需要知道数组沿第二维的宽度,以便计算沿第一维的下一个元素的开始。。。也就是说,为了知道
    X[1][0]
    所指的内存位置,编译器需要知道
    X[0]
    中有多少元素

    一种解决方案是使用指向每个矩阵开头的指针,自己进行地址计算。例如:

    Multiplier( int *Z, int *X, int *Y, int xr, int xcols_yrows, int yc) :
        Z( Z ), X( X ), Y( Y ), xr( xr ), xcols_yrows( xcols_yrows ), yc( yc ) {}
    // ...
    multipliers[r] = new Multiplier( &Z[0][0], &X[0][0], &Y[0][0], r, xcols_yrows, ycols );
    

    并且知道调用代码中的
    X[i][j]
    实际上是
    X[i*xcols\u yrows+j]
    内部的
    乘数

    签名有第7个参数(参见候选参数)。你确定一切都同步了吗?是的,这不是问题所在。我们使用的是C++的扩展名为UC++,但是我的语法和我们所学的一样。我还试着从Z、X和Y中去掉“&”,但仍然是个迷。一定是那些数组……好吧,首先,你通过的数组是二维的。也就是说,您通过的是(*)[int][int],而不是**int。无法在此处进行测试,但是像&(&(Z[0][0])这样的东西有什么作用呢?hrm。。。构造函数是否与二维数组不匹配?这是什么语言(或者您使用的是什么编译器扩展)?你不能在C++中有可变长度数组,也没有“<代码>任务> /代码>。签名有第七个参数(见候选)。你确定一切都同步了吗?是的,这不是问题所在。我们使用的是C++的扩展名为UC++,但是我的语法和我们所学的一样。我还试着从Z、X和Y中去掉“&”,但仍然是个迷。一定是那些数组……好吧,首先,你通过的数组是二维的。也就是说,您通过的是(*)[int][int],而不是**int。无法在此处进行测试,但是像&(&(Z[0][0])这样的东西有什么作用呢?hrm。。。构造函数是否与二维数组不匹配?这是什么语言(或者您使用的是什么编译器扩展)?你不能在C++中有可变长度数组,也没有“<代码>任务> /代码>。”:我习惯于PHP。从未想过多维数组w
    Multiplier( int *Z, int *X, int *Y, int xr, int xcols_yrows, int yc) :
        Z( Z ), X( X ), Y( Y ), xr( xr ), xcols_yrows( xcols_yrows ), yc( yc ) {}
    // ...
    multipliers[r] = new Multiplier( &Z[0][0], &X[0][0], &Y[0][0], r, xcols_yrows, ycols );