为什么编译器不能区分double**和double*
Why can the compiler not differentiate between double** and double*
我创建了两个例程,一个用于对向量进行就地排序:
void Sort(double** vector, unsigned int vectorLength) {
//...
}
和一个返回带有排序结果的新数组:
double* Sort(double* vector, unsigned int vectorLength) {
//...
}
后面使用sort方法:
double* test = new double[5];
//...
Sort(*test, 5);
我收到编译器错误,'没有一个重载可以转换所有的参数类型。'
类型不是double*(指向double类型的指针)与double**(指向double类型的指针)没有本质上的区别吗?
为什么这对编译器不清楚?
您得到错误,因为*test
表达式既不是double*
也不是double**
-它是double
,没有星号。
传递test
而不解引用它是可以工作的:
double* sorted = Sort(test, 5); // Invokes the second overload
注意,即使传递指针,也可以就地排序。使用一个重载,需要一个人工的&
,工作,但它使你的API反直觉。
更好的方法是定义一个具有相同参数集但名称不同的方法,例如
double* Sort(double* vector, size_t vectorLength) {
//...
}
void SortInPlace(double* vector, size_t vectorLength) {
//...
}
您的变量test
具有类型double*
,因此*double
具有类型double
。这意味着您正在尝试传递既不匹配double*
也不匹配double**
的double
。
一种可能是您实际上想要创建原始数组的排序副本:
double* sorted = Sort(test, 5);
但我宁愿假设,因为你对Sort
的调用忽略了返回值,你的意思是传递&test
来就地排序。
Sort(&test, 5);
然而,这本身就表明你的界面设计得很糟糕。如果希望函数修改test
,则传递&test
。但你没有。您希望该函数修改test
所引用的数组。您的就地排序函数可以而且应该通过传递一个类型为double*
的参数来实现。
我认为你在这里滥用了函数重载。我建议您选择一种不同的设计。我会使用不同名称的函数。
其他注释:
- 使用
size_t
作为数组长度 - 使用
const
表示输入参数不允许修改。
这是非常清楚的,但表达式*test
时,test
有类型double *
是相同的test[0]
,即它是一个double
,而不是一个指针,在所有
也许你想让&test
获取指针的地址
*test
直接访问存储在该内存地址中的值。因此,它会转到地址test
中的double
,这是一个指向double的指针。
所以,你传递的是一个double
值,而不是一个指针。
你的作品可以和下面两个中的任何一个一起使用:
Sort(test, 5); // Passes a pointer to double.
或
Sort(&test, 5); // Gives you the address of test. Passes a pointer to a pointer to double.
- C/C++编译器通常会删除重复的库吗
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- Win32编译器选项和内存分配
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++,我收到一个无法理解的编译器错误
- 在线编译器中的分段C++没有打印消息
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- C/C++预处理器是否可以检测一些编译器选项
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 我需要知道编译器如何在cpp中使用析构函数
- 编译器给出错误:format 指定类型 'float *',但参数的类型'double' [-Wformat]
- C 编译器从Double转换为INT
- 将运算符 ^ 与“double”操作数一起使用会发出编译器错误
- 当我使用模板时,编译器无法将函数的返回类型从 double 转换为 int
- 编译器警告从int型到double型的隐式转换
- c++ fab (long double)编译器警告
- 编译器警告在printf()中使用float而不是double
- 为什么编译器不能区分double**和double*