我正在处理一些无法使用 STL 容器的嵌入式代码。我有几个二维数组,其大小在编译时已知,并且想编写一个模板函数来清除它们。但是,我无法让它工作。这是我尝试过的:
template <std::size_t sizeA, std::size_t sizeB>
void clearArray(float a[sizeA][sizeB])
{
float* begin = &a[0][0];
std::fill_n(begin, sizeA * sizeB, 0.0);
}
int main()
{
float f[5][6];
clearArray(f);
for (int i = 0; i < 5; ++i)
for (int j = 0; j < 6; ++j)
cout << f[i][j] << " ";
}
但是,编译器无法成功执行参数查找:
test.cpp(22): error C2784: 'void clearArray(float [sizeA][sizeB])' : could not deduce template argument for 'float [sizeA][sizeB]' from 'float [5][6]' 1> test.cpp(13) : see declaration of 'clearArray'
有没有办法做到这一点?我知道我可以使用 sizeof(f)/sizeof(float)
获取元素的数量,或者我可以手动指定尺寸,但我希望尽可能简单。
此外,我在 VS2012 中对此进行了测试,但此嵌入式系统的编译器不支持 C++11。
最佳答案
当你将数组传递给函数时,它会衰减为指针(在这种情况下它会变成float (*a)[sizeB]
,关于大小的信息将会丢失,这就是编译器的原因无法推导出模板参数。您可以将其从按值传递更改为按引用传递,这将保持数组的大小:
template <std::size_t sizeA, std::size_t sizeB>
void clearArray(float (&a)[sizeA][sizeB])
关于c++ - 清除任意二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32017049/