2012-07-12 1 views
2

Я пытаюсь расширить класс boost::dynamic_bitset с некоторой функциональностью, в которой я нуждаюсь, например, подсчитывать биты после операции AND и т. Д. Также мне нужен доступ к частным членам (m_num_bits и т. Д.), Потому что Я хочу иметь возможность «переопределить» метод set(), чтобы обеспечить емкость битового набора с помощью параметра resize(), если pos бит для установки больше текущей емкости битов. Если я использую родную set() ГЕТ это прошлифованной ошибку утверждения в этом случае (поскольку метод set() не изменяет размер в таком случае)Расширение boost :: dynamic_bitset для добавления некоторой функциональности

Я не очень опытный с шаблонами, а также я просто получаю обратно в 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; 

Ofcourse это не компиляции ошибка:

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 или это нормально делать?

Любая помощь очень ценится.

ответ

1

Ваш ExtendedBitSet<> не имеет параметров по умолчанию для параметров типа шаблона, и ваш код пытается создать экземпляр, не указав их явно. Вместо этого попробуйте использовать ExtendedBitSet<unsigned, std::allocator<unsigned> > bs.

+0

Теперь я получаю несколько меньше ошибок, но до сих пор не принимаю создание объекта с размером как 'ExtendedBitSet > * bs = new ExtendedBitSet > (128); ', нужно ли переопределять конструктор базового класса (dynamic_bitset) в производном классе? На данный момент я и ошибка компилятора, которая говорит: 'error: нет соответствующей функции для вызова в ExtendedBitSet > :: ExtendedBitSet (int) ''. Кажется, я что-то пропустил ... –

+0

@ AndreasW.Wylach: Да, вы должны предоставить свои собственные ctors в 'ExtendedBitSet <>'. – wilx

+0

Спасибо, он работает. Также мне интересно, почему 'boost :: dynamic_bitset' не ** или ** биты разной длины, это имеет место в моем приложении, многие биты для OR имеют разную длину. Кажется, что Java Bitset справляется с этим делом. Есть ли причина для этого? –

 Смежные вопросы

  • Нет связанных вопросов^_^