我尝试用我需要的一些功能来扩展boost::dynamic_bitset类,例如在AND操作后对位进行计数等。另外,我还需要访问私有(private)成员(m_num_bits等),因为我希望能够“覆盖” set()方法以resize()fct来确保位集的容量,如果要设置的位的pos大于当前位集的容量。如果我使用本机的set() fct,则在这种情况下会通过断言错误(因为在这种情况下set()方法不会调整大小)

我对模板不是很有经验,而且由于几个星期后我才刚回到C++,这有点使用rust ,也许有人可以帮帮我。

我开始这样做:

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类派生的更好的方法,或者可以这样做吗?

任何帮助是极大的赞赏。

最佳答案

您的ExtendedBitSet<>没有模板类型参数的默认参数,并且您的代码尝试实例化它而不显式指定它们。尝试改用ExtendedBitSet<unsigned, std::allocator<unsigned> > bs

关于c++ - 扩展boost::dynamic_bitset以添加一些功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11445647/

10-11 23:20