C++ 将固定大小的数组传递给结构
您好,这是我在代码中遇到的一个提取问题 你知道为什么这段代码无法编译吗C++ 将固定大小的数组传递给结构,c++,C++,您好,这是我在代码中遇到的一个提取问题 你知道为什么这段代码无法编译吗 struct S { double arr[1]; S(double arr[1]) : arr(arr) {} }; int main(void) { double arr[1] = {1.2}; S p(arr); return 0; } 我正在使用g++,编译并运行 main.cpp: In constructor ‘S::S(double*)’: main.cpp:26:2
struct S {
double arr[1];
S(double arr[1]) : arr(arr) {}
};
int main(void) {
double arr[1] = {1.2};
S p(arr);
return 0;
}
我正在使用g++
,编译并运行
main.cpp: In constructor ‘S::S(double*)’:
main.cpp:26:28: error: incompatible types in assignment of ‘double*’ to ‘double [1]’
S(double arr[1]) : arr(arr) {}
你不能。您可以使用包装器来代替:
g++ -std=c++17 main.cpp kdtree.h kdtree.cpp && ./a.out
结构{
std::阵列arr;
数组arr:arr(arr){}
};
你知道为什么这段代码无法编译吗
struct S {
double arr[1];
S(double arr[1]) : arr(arr) {}
};
int main(void) {
double arr[1] = {1.2};
S p(arr);
return 0;
}
它不会编译,因为数组不能被复制初始化(复制列表初始化除外,但您没有这样做)
数组必须使用循环一次复制一个元素。还有一个标准的复制算法,所以您不需要自己编写循环:std::copy
或者,您可以使用C++11中引入的
std::array
<代码>标准::数组可复制。无法复制数组
struct S {
std::array<double, 1> arr;
S(std::array<double, 1> arr) : arr(arr) {}
};
此外,当您将数组传递给函数时,其名称将衰减为指针,因此S(double-arr[1])
相当于S(double-arr)
。进入函数后,必须复制单个元素,因此还需要数组的大小:
int a[3];
int b[3];
a = b; // illegal
如果将模板作为函数写入,则可以忽略大小:
S(double *x, std::size_t sz) {
std::copy_n(x, sz, arr);
}
template尽管构造函数的签名是这样写的,但数组类型被调整为指针,数组类型被调整为指向其第一个元素的指针
但是,结构中的arr成员仍然是array类型。并且指针不能分配给数组(因此出现错误)
也不可能将一个数组分配给另一个数组(例如,即使您将其更改为上述链接中描述的方式之一),因此您需要使用循环手动复制元素,或使用std::copy
,或使用std::array
,如Ron的回答中所述。您使用的编译器是什么?@Mad Physical Hi,g++。这是我使用的命令:g++-std=c++17 main.cpp kdtree.h kdtree.cpp&./a.out这里有一个IDEOne链接:。我独立地做了同样的编辑。我用相关信息编辑了你的问题。一般来说,不要回复任何可能与评论相关的内容。换言之,我不知道答案是什么,但我很想知道答案+谢谢!现在明白了。使用数组包装器会导致性能损失吗?@DanZilberman不会。在签名中,它被强制为POD(即使某些MSVC(库)版本未能将其报告为AFAIR),数组类型被调整为指针。调用函数时,将数组传递给这样的函数(或将数组名分配给指针的任何情况)时,会发生衰减。@juanchopanza-Hmm。这样更好吗?