2

boost::dynamic_bitsetAND 演算の後のビット数のカウントなど、必要な機能を使用してクラスを拡張しようとしています。また、set()メソッドを確実に「オーバーライド」できるようにするため、プライベート メンバー (m_num_bits など) へのアクセスも必要です。 resize() fctposを使用したビットセットの容量。設定するビットの が現在のビットセットの容量よりも大きい場合。ネイティブset()fct を使用すると、その場合はアサーション エラーが発生します (この場合、set()メソッドのサイズが変更されないため) 。

私はテンプレートの経験があまりありません。また、数週間前から C++ に戻ったばかりです。少し錆びています。誰かが私を助けてくれるかもしれません。

私はこれを始めました:

template <typename Block, typename Allocator>
class ExtendedBitSet : public boost::dynamic_bitset<Block, Allocator> {
    typedef boost::dynamic_bitset<Block, Allocator> super;
public:
    void set(std::size_t pos) {
        if (pos > super::size())
            super::resize(pos);
        set(pos);
    }
    bool get(std::size_t pos) const {
        return super::test(pos);
    }
};

// ...

ExtendedBitSet<> * bs = new ExtendedBitSet<>(128);
bs->set(33);
// ...
std::wcout << "Bit 48 is " << ((bs->get(48) == true) ? "true" : "false") << std::endl;
// ...
delete bs;

もちろん、これはコンパイルされていません。エラーは次のとおりです。

dynamic_bitset.cpp: In function ‘int main(int, char**)’:
dynamic_bitset.cpp:50: error: wrong number of template arguments (0, should be 2)
dynamic_bitset.cpp:7: error: provided for ‘template<class T, class Allocator> class ExtendedBitSet’
dynamic_bitset.cpp:50: error: invalid type in declaration before ‘=’ token
dynamic_bitset.cpp:50: error: wrong number of template arguments (0, should be 2)
dynamic_bitset.cpp:7: error: provided for ‘template<class T, class Allocator> class ExtendedBitSet’
dynamic_bitset.cpp:51: error: request for member ‘set’ in ‘* bs’, which is of non-class type ‘int’
..
dynamic_bitset.cpp:57: error: request for member ‘get’ in ‘* bs’, which is of non-class type ‘int’

誰かがそれを実行する方法のヒントを与えることができますか? また、dynamic_bitset クラスから派生するよりも良い方法がありますか、それともこれで問題ありませんか?

どんな助けでも大歓迎です。

4

1 に答える 1

1

ExtendedBitSet<>テンプレート型パラメーターの既定のパラメーターがなく、コードが明示的に指定せずにインスタンス化しようとしています。ExtendedBitSet<unsigned, std::allocator<unsigned> > bs代わりに使用してみてください。

于 2012-07-12T05:56:27.437 に答える