6
我試圖編譯下面的代碼:可變參數模板和C數組
template <typename T, int N> void foo(const T (&array)[N]) {}
template <typename T> static int args_fwd_(T const &t) { foo(t); return 0; }
template<class ...Us> void mycall(Us... args) {
int xs[] = { args_fwd_(args)... };
}
int main(void) {
int b[4];
mycall(b);
}
的mycall
功能使用可變參數模板,然後轉發到args_fwd_
函數調用每個參數的函數foo
。
這適用於大多數參數類型(假設我已適當定義了foo
函數)。但是當我嘗試傳遞一個C風格的數組(int b[4]
)時,它變成了一個指針,然後它找不到需要數組(不是指針)的模板foo
函數。從GCC 4.9.3錯誤如下:
error: no matching function for call to ‘foo(int* const&)’
note: candidate is:
note: template<class T, int N> void foo(const T (&)[N])
template <typename T, int N> void foo(const T (&array)[N]) {}
note: template argument deduction/substitution failed:
note: mismatched types ‘const T [N]’ and ‘int* const’
備註尋找一個指針的部分。這在叮噹中也是如此,所以顯然這符合標準。有沒有辦法保留這是一個C數組,而不會將它轉換爲指針?
有一件事要記住使用模板上的數組類型像這樣的:有針對你使用它在陣列中的每個大小的單獨的實例化。取決於程序中有多少不同大小的數組,這可能意味着大量的膨脹。 –