我有这段代码:
std::array<int,16> copyarray(int input[16])
{
std::array<int, 16> result;
std::copy(std::begin(input), std::end(input), std::begin(result));
return result;
}
当我尝试编译此代码时,我收到此错误:
'std::begin': no matching overloaded function found
以及std::end
的类似错误。
问题是什么以及如何解决?
答案 0 :(得分:40)
在参数声明中,int input[16]
与int* input
相同。当你传递参数数组decay to pointer时,两者都意味着有关数组大小的信息会丢失。而std::begin
和std::end
无法使用指针。
您可以将其更改为pass-by-reference,它会保留数组的大小。
std::array<int,16> copyarray(int (&input)[16])
请注意,您现在只能将具有精确大小16
的数组传递给函数。
答案 1 :(得分:34)
已经重要的said,你可以让这个功能更灵活一点:
template <typename T, size_t N>
std::array<T, N> copyarray(T const (&input)[N])
{
std::array<T, N> result;
std::copy(std::begin(input), std::end(input), std::begin(result));
return result;
}
答案 2 :(得分:1)
如上所述,问题在于数组在传递给函数时会衰减为指针,这意味着不会保留大小。
如果您知道数组中有16个元素,您可以这样做:
array<int,16> copyarray(const int input[]) {
array<int, 16> result;
copy_n(input, size(result), begin(result));
return result;
}