C++ 返回值类型与函数类型不匹配

C++ Return value type does not match the function type

本文关键字:类型 不匹配 函数 C++ 返回值      更新时间:2023-10-16

我正在尝试返回一个矩阵,并且在该方法中它给了我错误:返回值类型与函数类型不匹配。

这是矩阵:

float obstaculos[20][4];

这是方法:

float** getObstaculos() {
    return obstaculos;
}

你知道问题可能是什么吗?

float obstaculos[20][4];

... 是float值数组的数组。由于sizeof要求,它是内存中float值的连续序列。

float**

... 是指向 float 的指针。float值的单个序列(obstaculos矩阵)可以自然地转换为直接指针(即指向第一项),但是该内存中没有存储的指针可以获取指向指针的指针。

所以,一种可能性是做

using Row = float[4];
Row obstaculos[20];
Row* getObstaculos() {
    return obstaculos;
}

但是最好定义一个矩阵,例如

#include <array>
using Row = std::array<float, 4>;
using Matrix = std::array<Row, 20>;
Matrix obstaculos;
Matrix* getObstaculos() {
    return &obstaculos;
}

如果您确实需要一个指针数组,那么您可能希望使矩阵最初采用该形式。


修正案:如果需要,下面是计算指向行的指针数组的一种方法:

using Row_data_pointers = std::array<float*, std::tuple_size<Matrix>::value>;
auto data_pointers( Matrix& m )
    -> Row_data_pointers
{
    Row_data_pointers result;
    for( int i = 0; i < int( std::tuple_size<Row_data_pointers>::value ); ++i )
    {
        result[i] = &m[i][0];
    }
    return result;
}

虽然float*float[N]相似的类型(它们可以以类似的方式使用,第一个可以从第二个隐式初始化),但这不适用于嵌套数组

为什么会这样?

类型 float** 是指向指针的指针。当您像 2D 数组/矩阵(应用了两个下标运算符)一样使用它时,第一个指针应指向指向更多数组(例如单个行)的指针数组

但是,float[N][M]是整个矩阵的连续内存块。没有(行)指针数组,并且没有一个可以通过强制转换为float**隐式创建,因此标准无法实现此强制转换。

你能做什么?

可以返回对多维数组的引用。为此,首先为矩阵创建一个 typedef:typedef float matrix[20][4];,然后使用返回类型matrix&

或者避免嵌套数组。使用一维数组并在访问时计算索引(例如 matrix[row * N + col]而不是matrix[row][col])。将此索引计算隐藏在矩阵类中,该矩阵类返回第一个operator[]的帮助器对象。

更好:使用线性代数库来处理矩阵,例如特征矩阵。