c++:对构造函数没有匹配的函数调用
C++: no matching function call for constructor?
下面是我使用的构造函数的声明:
_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 xrows, xcols_yrows, ycols;
// [cols][rows]
int X[xrows][xcols_yrows], Y[xcols_yrows][ycols], Z[xrows][ycols];
// start threads to multiply rows
Multiplier *multipliers[xrows];
for( int r = 0; r < xrows; r++ ) {
multipliers[r] = new Multiplier( &Z, &X, &Y, r, xcols_yrows, ycols );
}
(都已初始化)但是我得到了这个奇怪的错误:
q3.cc: In member function 'virtual void uMain::main()':
q3.cc:132: error: no matching function for call to 'Multiplier::Multiplier(int (*)[(((unsigned int)(((int)xrows) + -0x00000000000000001)) + 1)][(((unsigned int)(((int)ycols) + -0x00000000000000001)) + 1)], int (*)[(((unsigned int)(((int)xrows) + -0x00000000000000001)) + 1)][(((unsigned int)(((int)xcols_yrows) + -0x00000000000000001)) + 1)], int (*)[(((unsigned int)(((int)xcols_yrows) + -0x00000000000000001)) + 1)][(((unsigned int)(((int)ycols) + -0x00000000000000001)) + 1)], int&, int&, int&)'
q3.cc:37: note: candidates are: Multiplier::Multiplier(int**, int**, int**, int, int, int, UPP::uAction)
q3.cc:26: note: Multiplier::Multiplier(Multiplier&)
make: *** [q3.o] Error 1
问题是功能参数X
, Y
和Z
基本上期望array of pointers to int
,但您给它一个pointer to an array of arrays of 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]
实际上是Multiplier
中的X[i*xcols_yrows+j]
。
形参声明int *Z[]
指定了一个指向整型的指针数组。成员声明int **Z
指定指向指针(或指针数组)的指针。实参类型int X[xrows][xcols_yrows]
是一个没有指针的多维数组。
此外,分配的存储在堆栈上,它将在return
语句之后消失。由于Multiplier对象被分配了new
,因此该数组应该具有类似的生存期。可能数组应该由Multiplier::Multiplier
中的new
分配,或者在任何情况下,它应该由unique_ptr
或auto_ptr
对象管理。
第一个问题有几个解决方案:
- 使用模板化的构造函数在编译时检测数组的尺寸。
- 使用
new
或calloc
分配的指针数组 - 分配一个一维数组并以多维方式使用它。
相关文章:
- 在c++中使用向量时,如何调用构造函数和析构函数
- C++:考虑但不调用构造函数的特殊性
- 对象实例化调用构造函数的次数太多
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- C ++:通过大括号调用构造函数?
- 不能调用构造函数
- 赋值 boost::intrusive_ptr 而不调用构造函数?
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 当我尝试从成员函数调用构造函数时,为什么IDE会发出警告
- 从复制构造函数调用构造函数
- 从同一类的另一个构造函数调用构造函数
- 从另一个成员函数/构造函数调用C++构造函数是否执行初始值设定项列表
- 通过引用从函数调用C++构造函数
- 从不同类的构造函数调用构造函数
- 错误:没有匹配的函数调用'构造函数'注意:候选函数是:
- 从构造函数调用构造函数
- 用数组初始化从另一个构造函数调用c++构造函数
- 从成员函数调用构造函数
- 在c++中从另一个构造函数调用构造函数时出错
- 可以从静态函数调用构造函数