2015-08-14 57 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