boost :: array <char,2 =“”>如何将2作为变量传递</char,>

时间:2012-04-27 22:03:32

标签: c++ boost

我正在使用具有格式的boost :: array &LT; char,const std :: size_t&gt;

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:&#39; boost :: array&#39; :模板参数&#39; N&#39; :&#39;尺寸&#39; :局部变量不能用作非类型参数

你能给我一个提示如何传递boost :: array的第二个参数吗?

感谢

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分: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>();

答案 2 :(得分:2)

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

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一个编译时常量。

答案 3 :(得分:0)

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