【问题标题】:Extend boost::dynamic_bitset to add some functionality扩展 boost::dynamic_bitset 以添加一些功能
【发布时间】:2012-07-12 05:45:23
【问题描述】:

我尝试使用我需要的一些功能来扩展boost::dynamic_bitset 类,例如在 AND 操作后计算位等。我还需要访问私有成员(m_num_bits 等),因为我希望能够“覆盖”set() 方法以确保使用 resize() fct 的位集容量,如果要设置的位的pos 大于当前位集容量。如果我使用本机 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 类派生更好的方法吗?或者这样做可以吗?

非常感谢任何帮助。

【问题讨论】:

    标签: c++ boost derived-class boost-dynamic-bitset


    【解决方案1】:

    您的ExtendedBitSet&lt;&gt; 没有模板类型参数的默认参数,并且您的代码试图实例化它而不明确指定它们。尝试改用ExtendedBitSet&lt;unsigned, std::allocator&lt;unsigned&gt; &gt; bs

    【讨论】:

    • 我现在少了一些错误,但仍然不接受创建大小为ExtendedBitSet&lt;unsigned, std::allocator&lt;unsigned&gt; &gt; * bs = new ExtendedBitSet&lt;unsigned, std::allocator&lt;unsigned&gt; &gt;(128);的对象,我是否必须在派生类中重写基类构造函数(dynamic_bitset)也?现在我遇到了一个编译器错误,上面写着:error: no matching function for call to ‘ExtendedBitSet&lt;unsigned int, std::allocator&lt;unsigned int&gt; &gt;::ExtendedBitSet(int)’。我似乎在某个地方错过了什么......
    • @AndreasW.Wylach:是的,你必须在ExtendedBitSet&lt;&gt; 中提供自己的演员。
    • 谢谢,运行起来了。另外我想知道为什么boost::dynamic_bitsetOR 不同长度的位集,在我的应用程序中就是这种情况,许多位集要进行不同长度的或运算。 Java Bitset 似乎可以处理这种情况。有什么理由吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 2015-11-24
    • 1970-01-01
    相关资源
    最近更新 更多