2013-08-28 54 views
2

我已經試過:獲取數組的長度。編譯器錯誤。

template <typename T,unsigned S> 
unsigned getArraySize(const T (&v)[S]) { return S; } 

Motti的回答https://stackoverflow.com/a/18078435/512225

後,但我得到這個消息:

錯誤C2265: '':參考一零大小的數組是非法的

我的編譯器出了什麼問題?

我給看看這個頁面: http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/4b78bcef-4c33-42f1-a4c5-fb6f702ced0b/vs6-c-compile-error-using-getaddrinfo 所以我嘗試這個解決方案:

template <typename T,unsigned S> 
unsigned getArraySize(const T v[S]) { return S; } 

這個編譯,但是當我嘗試使用它:

double myX[2] = {7,3}; 
std::cout << getArraySize(myX) << std::endl; 

我得到一個編譯錯誤:
錯誤C2783:'unsigned int __cdecl getArraySize(const T [])':無法推斷'S'的模板參數

除了更改編譯器之外,有沒有可用於獲取數組大小的解決方法?

+0

使用'std :: array'。當第一次定義'getArraySize(myX)'時,錯誤是什麼?該錯誤意味着一個零長度的數組,但是你的數組myX顯然具有多於零的元素。 – Rapptz

+0

您可以發佈爲您提供C2265第一個解決方案的代碼嗎? – Angew

+1

第一個例子應該工作......我從字面上複製/粘貼它並運行它,然後它返回2.你有什麼編譯器? –

回答

2

這可能是VC6的限制,你有沒有試過其他編譯器?

1

but I've got this message:

error C2265: '' : reference to a zero-sized array is illegal

零大小的數組在C++中是非法的。
所以這可能意味着你嘗試了一個零大小的數組。

this compiles, but when I try to use it:

如果你不使用它。然後編譯器會忽略一個模板(即使它有錯誤)。這是因爲在不知道涉及的類型的情況下,無法總是推導出模板函數是否正確。所以除非有對模板函數的調用,否則不會產生錯誤信息。

template <typename T,unsigned S>
unsigned getArraySize(const T v[S]) { return S; }

失敗的原因是你不能傳遞數組作爲參數(你只能引用傳遞數組)。