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':ローカル変数を非型引数として使用できません

2番目のパラメーターであるboost::arrayを渡す方法のヒントを教えてください。

ありがとう

4

4 に答える 4

6

テンプレートはコンパイル中にインスタンス化されるため、プログラムを実行する前にパラメーターを知る必要があります。

つまり、変数をテンプレートパラメータとして使用することはできません。このようなパラメーターは、定数式(定数変数では不十分)、外部リンケージを持つ関数またはオブジェクトのアドレス、または静的クラスメンバーのアドレスである必要があります。

于 2012-04-27T22:07:14.577 に答える
3

2番目のパラメーターは、コンパイル時定数でなければなりません。

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

テンプレート値は、コンパイル時定数、つまりリテラルconstexprまたはstatic const変数である必要があります。

于 2012-04-27T22:06:58.263 に答える