我们如何从函数中返回复杂数据类型,例如指向int数组的指针?
考虑下面的(非编译)代码:
int (*) [50] fcreate()
{
int (*p) [50]= new int[60][50];
return p;
}
为什么它不起作用?
Error:
Expected un-qualified id before '(' in :
int (*) [50] fcreate();
答案 0 :(得分:4)
一种解决方案是首先用现代语法表达函数:
auto fcreate()
-> int (*)[50]
{ return new int[60][50]; }
auto main()
-> int
{
int x = fcreate; // This won't compile: diagnostic shows syntax for you.
}
然后,当您编译此x
声明的诊断时,会告诉您声明该函数的旧样式语法:
foo.cpp:8:13: error: invalid conversion from 'int (* (*)())[50]' to 'int'
即。使用旧语法,您可以将此函数定义为
int (*(fcreate)())[50]
{
return new int[60][50];
}
尽管如此,使用std::vector
通常更好。
或者为内部存储定义了std::vector
的矩阵类。
旧的语法声明看起来很丑陋,虽然它易于分析,但很难同步。可以通过定义数组项类型的名称来简化它。像这样:
using Array_item = int[50];
Array_item* fcreate()
{
return new int[60][50];
}
您可以使用C ++ 03 using
。
typedef
但是使用现代更清晰的尾随返回类型语法,这种解决方法的优势较少。
答案 1 :(得分:3)
正确的语法如下:
int (*fcreate()) [50] {
int (*p) [50]= new int[60][50];
return p;
}
或者您可以使用中间别名:
template <typename T, size_t N>
using raw_array = T[N];
raw_array<int, 50>* fcreate() {
int (*p) [50]= new int[60][50];
return p;
}
但如果您想要第二维的固定大小的二维矩阵,那么您宁愿结合std::vector
和std::array
:
auto fcreate() {
return std::vector<std::array<int, 50>>{};
}