2014-01-26 5 views
0

У меня есть класс ItemThreadingController с boost::ptr_unordered_map где ключ id темы, а значение - boost::thread с некоторой задачей. Я хочу добавить и удалить темы. В основном это примитивный менеджер потоков.using boost ptr_unordered_map

Вопрос в том, что является правильным способом использования ptr_unordered_map - объявить и получить доступ к его элементам? Когда я пытаюсь как этот

class ItemThreadingController 
{ 
private: 
boost::ptr_unordered_map<int, boost::thread> controllerMap; 
long int id; 
public: 
ItemThreadingController() 
{ 
    id = -1; 
} 
int AddThread(void (*func)()) 
{ 
    boost::thread t(func); 
    id++; 
    controllerMap.insert(std::make_pair(id, t)); 
    return id; 
} 
void StopThread(long int id) 
{ 
    controllerMap[id].interrupt(); 
    controllerMap[id].join(); 
    controllerMap.erase(id); 
    cout<<"Thread "<<id<<"has stopped and erased!"<<endl; 
} 
~ItemThreadingController() {}; 
}; 

У меня есть несколько ошибок

error C2664: 'void boost::ptr_map_adapter<T,VoidPtrMap,CloneAllocator,Ordered>::insert<boost::type>(InputIterator,InputIterator)' : cannot convert parameter 1 from 'boost::type' to 'boost::type' 518 
error C2664: 'boost::ptr_map_iterator<I,F,S> boost::ptr_container_detail::associative_ptr_container<Config,CloneAllocator>::erase(boost::ptr_map_iterator<I,F,S>,boost::ptr_map_iterator<I,F,S>)' : cannot convert parameter 1 from 'boost::type' to 'boost::ptr_map_iterator<I,F,S>' 185 
error C2039: 'type' : is not a member of 'boost::mpl::eval_if_c<C,F1,F2>' 63 
error C2039: 'type' : is not a member of 'boost::mpl::eval_if_c<C,F1,F2>' 63 

Как правильно его использовать?

ответ

1

boost::ptr_unordered_map<A, B> можно рассматривать как эквивалент std::unordered_map<A, std::unique_ptr<B>>. Он направлен на упрощение управления памятью при удалении и удалении элементов.

Когда вы делаете это:

boost::thread t(func); 
id++; 
controllerMap.insert(std::make_pair(id, t)); 

Он не может работать карта ожидает указатель как pair::second.

Кроме того, я не уверен, boost::ptr_XXX подражает точно std::XXXX, и я не думаю, что есть boost::ptr_unordered_map<A, B>::insert() перегрузки принимая std::pair<A, B*>. Но по крайней мере у вас перегрузка boost::ptr_unoreder_map<A, B>::insert(A&, B*);.

+0

И что я должен вставить? Когда я отправляю '& t' в качестве второго параметра, он не работает либо – lapots

+0

@ user1432980 Это не работает, потому что' t' определено в стеке и неверно занимает адрес временного. Но это наверняка скомпилируется. По крайней мере, если вы используете перегрузку 'insert (key, value *)', потому что я не думаю, что есть перегрузка 'std :: pair <>' insert. – Johan

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