2014-02-10 145 views
4

微軟VC++ 2010給出了關於此代碼的錯誤:數組類型模板參數推導

template <int D, typename T> 
void Foo(T x[D]) { 
    // details omitted 
} 

int main() { 
    float x[3]; 
    Foo(x); // C2784: could not deduce template argument for 'T [D]' from 'float [3]' 
    return 0; 
} 

相同的代碼通過用gcc和鐺鼓起。

這是VC++ 2010的錯誤嗎?

如果它是一個錯誤:

  1. 有誰知道,如果它被固定在VC++的更高版本?
  2. 除了明確調用Foo<3, float>之外,還有一種解決方法嗎?

如果它是不是一個錯誤:

有一個擴展,GCC和鐺,使他們能夠解決模板參數?

我已經大大簡化了實際的代碼到這個小例子。我已經在其他編譯器上嘗試過了,但我目前無法訪問較新的Microsoft編譯器。我在SO上發現了類似的問題,但沒有一個具體解決這個問題。

+0

'Visual Studio 2013'和'Visual C++ Compiler Nov 2013 CTP'我得到同樣的錯誤。 – bolov

+0

不能與鏗鏘爲我編譯:http://coliru.stacked-crooked.com/a/918ee9e151031a46 - 也不gcc:http://coliru.stacked-crooked.com/a/0399a5aff6ce0f83 –

+0

啊,對不起gcc和clang紅鯡魚。他們接受更爲複雜的Foo版本,顯然是因爲他們能夠從第二個參數中推導出參數。但MS VC++不接受更復雜的版本。因爲複雜的版本太長而無法發佈,所以我簡化了這個,但實際上並沒有測試我最後一次對gcc和clang的迭代。 –

回答

6

T x[D]類型的參數相當於T x[]又名T* x。無法從中推導出D。使其成爲void Foo(T (&x)[D]) - 您以這種方式傳遞對數組的引用。

+0

我不知道模板參數演繹如何在這裏工作,但'T x []'與'T * x'不是同一類型。爲什麼它在gcc和clang中工作? – bolov

+2

@bolov:是的,它在參數列表中是一樣的(你不能按值傳遞數組)。不,它不適用於gcc和clang,至少不適合我。 –

+0

@BenjaminLindley再一次,我不知道這裏的模板演繹,所以我們暫時忘了關於模板。 'int x []'與'int * x'不是相同的類型。 'int * x'是一個指針,而'int x []'是一個數組類型的不完整類型。它們可以相互轉換,但它們不是相同的類型。現在我錯了,但我很確定我是對的。你能解釋我爲什麼錯了嗎? – bolov