【问题标题】:variable-sized array type ‘int [size]’ is not a valid template argument可变大小数组类型“int [size]”不是有效的模板参数
【发布时间】:2017-09-11 11:00:40
【问题描述】:

我在 c++ 程序中遇到以下错误:

可变大小的数组类型‘int [size]’不是一个有效的模板 论据

对于以下程序:

#include <iostream>
using namespace std;

template <typename T>
void func (T& Array)
{
    cout << "Hi";
}

int main ()
{
    int size = 100;
    int arr [100];
    int arr1 [size];
    func (arr);   // compiled
    func (arr1);  // gives error
}

请帮我解决这个问题。我想从某个变量中获取数组的大小。 提前致谢。

【问题讨论】:

  • C++ 实际上并没有variable-length arrays,尽管一些编译器将它添加为语言的扩展。
  • 您在模板函数func(T&amp; Array) 中如何处理Array?你不会用它做任何事情。要解决您的问题,您可以使用动态分配,但模板不是解决方案。
  • 至于您的问题,请记住模板是纯编译时特性。变长数组是在运行时创建的。
  • 我们无法真正告诉您解决方案,因为我们不知道您想用这个解决的实际问题。您要求我们帮助您解决(对我们而言)未知问题的解决方案,这称为the XY problem
  • std::vector&lt;int&gt; arr1(size); 可能会起作用。

标签: c++ c++11 templates


【解决方案1】:

替换:

int size = 100;

const int size = 100;

这样编译器就知道size不会改变,可以为静态数组arr1正确分配空间

【讨论】:

  • 这不是问题。 VLA 可以存在,因为编译器知道如何“正确”处理它。
  • @PasserBy 不太明白你的意思,因为建议的改变会使程序合法的官方C++,导致数组绑定在编译时就知道,并且可以使用数组类型作为推导出模板参数。
  • @aschepler 解释说空间不能分配,因为它是一个运行时值,这是不正确的。当然可以,否则这种扩展是不可能的。不好是因为它不是标准的并且破坏了类型系统。
  • @PasserBy:你是对的,但是使用变量来定义数组的大小是非常不安全的。我认为聪明的编译器会产生一个警告。如果将定义为intarr1 修改为一个更大的值,然后将arr1 元素用作绑定,会发生什么情况?显然是Segmentation fault (core dumped)
  • constexpr也可以使用
【解决方案2】:

在 C++ 中,您不能使用变量定义数组的大小。 我建议您将这个数组替换为 vector 或定义一个 预处理器宏 来保存数组的大小。

【讨论】:

  • 预处理宏不,它是 C++,千万不要在可以使用整数常量的地方使用宏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
相关资源
最近更新 更多