1

我正在使用格式为 < char, const std::size_t > 的 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 第二个参数吗?

谢谢

4

4 回答 4

6

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

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

于 2012-04-27T22:07:14.577 回答
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>();
于 2012-04-27T22:10:59.240 回答
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 一个编译时间常数。

于 2012-04-27T22:13:31.683 回答
0

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

于 2012-04-27T22:06:58.263 回答