c++ - 为什么编译器不能区分 double** 和 double*

标签 c++ c pointers arguments

我创建了两个例程,一个用于就地对 vector 进行排序:

void Sort(double** vector, unsigned int vectorLength) {
    //...
}

还有一个返回一个带有排序结果的新数组:

double* Sort(double* vector, unsigned int vectorLength) {
    //...
}

稍后使用排序方法:

double* test = new double[5];
//...
Sort(*test, 5);

我收到“2 个重载中没有一个可以转换所有参数类型”的编译器错误。

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) {
    //...
}

关于c++ - 为什么编译器不能区分 double** 和 double*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22667256/

相关文章:

c++ - 通过转换 boost 状态图传递参数

c++ - '/'在一些头文件中的应用

c - 在c中动态增加数组(int *)的大小

c++ - 资源管理- vector 和指针

c++ - openmp Linux 中的段错误

c++ - 将枚举类传播到更高级别的类

c++ - 如何找到计算机的 IP 地址?

c - 新声明后内存地址是否改变?

c - 我的 pthread 函数出错

c - 诡异的 。 C 中的表示法?这叫什么,有人可以解释一下吗?