我正在处理一些我无法使用STL容器的嵌入式代码。我有几个2D数组,其大小在编译时是已知的,并且想要编写模板函数来清除它们。但是,我无法让它发挥作用。这就是我的尝试:
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):错误C2784:&#39; void clearArray(float [sizeA] [sizeB])&#39; :无法推断出&#39; float [sizeA] [sizeB]&#39;的模板参数来自&#39; float [5] [6]&#39; 1 GT; test.cpp(13):参见&lt; clearArray&#39;
的声明
有办法做到这一点吗?我知道我可以使用sizeof(f)/sizeof(float)
来获取元素的数量,或者我可以手动指定尺寸,但我希望尽可能简单。
另外,我在VS2012中对此进行了测试,但该嵌入式系统的编译器不支持C ++ 11。
答案 0 :(得分:8)
当你将数组传递给函数时,它将衰减为指针(在这种情况下它将变为float (*a)[sizeB]
,关于大小的信息将丢失,这就是编译器无法推断出模板参数的原因。你可以改变它从传递值到传递引用,这将保持数组的大小:
template <std::size_t sizeA, std::size_t sizeB>
void clearArray(float (&a)[sizeA][sizeB])