0

私はテンプレートを試していて、この単純なクラスメソッドを書きました:

void Decimal::toBinary(size_t bits) {
    // decimalNumber being a class private variable (long double)
    std::bitset< bits > result(decimalNumber);

    std::cout << result << std::endl;
}

size_t bits関数の引数をビットセット テンプレートに渡そうとしています。

C++ Bitset Referenceによると、実装は実際に size_t 引数を取ります。

template < size_t N > class bitset;

しかし、私は得ています

src/decimal.cc:11: error: ‘bits’ cannot appear in a constant-expression
src/decimal.cc:11: error: template argument 1 is invalid
src/decimal.cc:11: error: invalid type in declaration before ‘(’ token

私はこれを行うことができないと思います...回避策はありますか?

4

1 に答える 1

2

テンプレートはコンパイル時の機能であり、実行時の機能ではありません。サポートしようとしている異なるサイズの数が制限されている場合 (たとえば、8、16、および 32 ビットをサポートしているために)、switch委任することができます。

template <size_t bits>
void Decimal::toBinary() {
    std::bitset< bits > result(decimalNumber);
    std::cout << result << '\n';
}
void Decimal::toBinary(size_t bits) {
    switch (bits) {
    default: throw std::runtime_error("number of bits not supprted");
    case  8: this->toBinary< 8>(); break;
    case 16: this->toBinary<16>(); break;
    case 32: this->toBinary<32>(); break;
    }
}

ところで、使用しないstd::endlでください。本当にストリームをフラッシュするつもりなら、std::flush.

于 2012-11-16T23:41:56.920 に答える