获取数组的长度。编译错误。

时间:2013-08-28 07:48:10

标签: c++ arrays templates compiler-errors vc6

我试过了:

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

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

之后

但我收到了这条消息:

错误C2265:&#39;&#39; :引用零大小的数组是非法的

我的编译器出了什么问题?

我看了一下这个页面: 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:&#39; unsigned int __cdecl getArraySize(const T [])&#39; :无法推断出&#39; S&#39;

的模板参数

除了更改编译器之外,我是否可以使用解决方法来获取阵列的大小?

2 个答案:

答案 0 :(得分:2)

这可能是VC6的限制,您是否尝试过其他编译器?

答案 1 :(得分:1)

  

但我收到了这条消息:

     

错误C2265:'':对零大小数组的引用是非法的

在C ++中,零大小的数组是非法的 所以这可能意味着您尝试使用零大小的数组。

  

这个编译,但当我尝试使用它时:

如果您不使用它。然后编译器将忽略模板(即使它有错误)。这是因为在不知道所涉及的类型的情况下,您无法总是推断模板函数是否正确。因此,除非调用模板函数,否则不会生成错误消息。

  

模板&lt; typename T,unsigned S&gt;
  unsigned getArraySize(const T v [S]){return S; }

这会失败,因为您不允许将数组作为参数传递(您只能将引用传递给数组)。