【问题标题】:boost::array<char, 2> how to pass the 2 as variableboost::array<char, 2> 如何将 2 作为变量传递
【发布时间】:2012-05-08 15:54:48
【问题描述】:

我正在使用具有格式的 boost::array

void test(const std::size_t XXX)
{
    boost::shared_ptr<boost::array<unsigned char, XXX>> buf(new boost::array<unsigned char, max_size>);
    .
    .
    .
};
test(100);
test(20);

这是领先

到错误:

错误 C2971: 'boost::array' : 模板参数 'N' : 'size' : 局部变量不能用作非类型参数

你能告诉我如何传递 boost::array 第二个参数吗?

谢谢

【问题讨论】:

  • 或者就此而言vector&lt;unsigned char&gt; - 从代码的外观来看,我猜想buf 的寿命不会超过对test 的调用,因此不需要共享所有权.唯一的方法是 test 将其存储到某个长期存在的对象(如全局对象,或者 this 如果test 是成员函数)。

标签: c++ boost


【解决方案1】:

模板值必须是编译时常量,即字面量,constexprstatic const 变量。

【讨论】:

  • 其实可以,比如静态初始化的const int。
  • 常量表达式比“运行时变量”更合适。当然,如果某个东西是静态初始化的并且是常量……它真的是一个“变量”吗?
  • 根据您的编辑,常量表达式涵盖其他两种情况。
【解决方案2】:

模板在编译过程中被实例化,因此在程序运行之前必须知道它们的参数。

这意味着您不能将变量用作模板参数。这样的参数必须是常量表达式(常量变量是不够的),外部链接的函数或对象的地址,或者静态类成员的地址。

【讨论】:

    【解决方案3】:

    第二个参数必须是编译时间常数。

    您可以将test() 设为模板函数:

    template <size_t max_size> void test()
    {
        boost::shared_ptr<boost::array<unsigned char, max_size>> buf(
            new boost::array<unsigned char, max_size>);
    }
    test<100>();
    test<20>();
    

    【讨论】:

      【解决方案4】:

      您不能使用非编译时值作为模板参数,因为模板必须在编译时实例化。

      std::array 和 boost::array 只能用于静态大小的数组。如果你需要一个动态大小的数组,你可以使用 std::vector 代替。

      通常你不需要持有一个带有 shared_ptr 的向量,直接持有它:

      void test(const std::size_t XXX)
      {
          std::vector<char> buf(XXX);
          .
          .
          .
      };
      test(100);
      test(20);
      

      或者像 hmjd 说的你可以给 XXX 传递一个编译时间常数。

      【讨论】:

        猜你喜欢
        • 2017-08-20
        • 1970-01-01
        • 2016-06-26
        • 1970-01-01
        • 2015-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-05
        相关资源
        最近更新 更多