2015-08-14 54 views
4

我正在处理一些嵌入式代码,我无法使用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):错误C2784:“无效clearArray(浮动[SIZEA] [sizeB ])”:无法推断出模板参数为 '' 从 '浮起[5] [6]浮动[SIZEA] [sizeB]' 1> TEST.CPP(13):看到的声明 'clearArray'

有没有办法做到这一点?我知道我可以使用sizeof(f)/sizeof(float)来获取元素的数量,或者我可以手动指定尺寸,但是我希望尽可能简单。

另外,我在VS2012中测试了这个,但是这个嵌入式系统的编译器不支持C++ 11。

回答

8

当你将数组传递给函数时,它会衰减到指针(在这种情况下,它将变为float (*a)[sizeB],关于大小的信息将会丢失,这就是为什么编译器无法推导出模板参数的原因。值按引用传递,这将让数组的大小:

template <std::size_t sizeA, std::size_t sizeB> 
void clearArray(float (&a)[sizeA][sizeB]) 

LIVE

+0

真奇怪我的印象是,它不会腐烂的指针,如果你明确指定尺寸此。伟大的作品 – rlbond

+0

@rlbond不,即使你指定了deme也会衰败nsions。对于一维数组,二维数组等是如此。 – songyuanyao