C++ 返回值类型与函数类型不匹配
C++ Return value type does not match the function type
我正在尝试返回一个矩阵,并且在该方法中它给了我错误:返回值类型与函数类型不匹配。
这是矩阵:
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[]
的帮助器对象。
更好:使用线性代数库来处理矩阵,例如特征矩阵。
- 将 unordered_map 与 Catch2 谓词一起使用时类型不匹配
- 重载函数的地址与所需类型不匹配
- 参数错误可能与类型不匹配有关?
- 调用子例程时类型不匹配
- POSIX(C )参数类型不匹配
- typedef 类型不匹配,将其传递到函数中
- 为什么此代码编译 (C++11) 而没有类型不匹配错误
- 候选模板被忽略:推断的类型与调整后的类型不匹配
- 内联 ASM:'out'的操作数类型不匹配
- 为什么我们有一个类型不匹配
- C++类和freeglut(参数类型不匹配)
- 警告 639:二进制操作中类型 'uint64' 的强类型不匹配
- 警告 634:相等或有条件的强类型不匹配(类型"bool")
- 不了解C++类型不匹配:const Foo* to Foo* const&
- 函数声明和定义的返回类型不匹配,编译器可以吗?
- 类型不匹配
- 返回指向常量getter的指针时,返回值类型与函数类型不匹配
- llvm pass replaceAllUses与类型不匹配?
- 参数类型不匹配(无效*)
- 重载运算符中的类型不匹配(写入管道)