我正在使用具有格式的boost :: array < char,const std :: size_t>
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的第二个参数吗?
感谢
答案 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)
模板值必须是编译时常量,即文字,constexpr
或static const
变量。