2015-09-17 3 views
1

Итак, я создаю симулятор, чтобы имитировать некоторые алгоритмы балансировки нагрузки. Я создал 2 векторов сердечников и диспетчеров, как показано ниже:Как хранить внутри очереди уникальный_ptr объекта, который находится внутри вектора

std::vector<std::unique_ptr<Dispatcher> > vDisp; 
std::vector<std::unique_ptr<Core> > vCore; 

Класса грузоотправителя имеет очередь для сердечников, чтобы назначить для них рабочих мест.

std::queue<Core> disp_core_queue; 

Плюс у меня есть некоторые функции для того, чтобы справиться с этой очередью:

void add_core_q(Core& p){ disp_core_queue.push(p); } 
Core get_core_q(){ return disp_core_queue.front(); } 

Когда программа инициализирует я заселить ядра и disps так:

for (auto i=0; i<dispNumb; ++i) 
{ 
    vDisp.push_back(std::unique_ptr<Dispatcher> (new Dispatcher)); 
    std::cout<<"Disp n."<<i<<" Created"<<std::endl; 
} 

Моя проблема заключается в том, что Я не могу получить Core из вектора и хранить его в очереди диспетчера. Я пробовал много способов, но кажется, что C++ наказывает меня по разным причинам. Моя последняя попытка была это одна из внутри Диспетчера:

int kore = random_core(); 
    this->add_core_q(vCore.at(kore)); 

Который дал эту ошибку во время компиляции:

ошибка: нет подходящей функции для вызова «Dispatcher :: add_core_q (_gnu_cxx :: __ alloc_traits> > :: value_type &) '

кандидат:

недействительным грузоотправитель :: объявления d_core_q (основной &)

не известно преобразование для аргумента 1 из '__gnu_cxx :: __ alloc_traits>> :: value_type {ака станд :: unique_ptr}' на 'Ядра &'

Если кто-нибудь может дать я намекнул, что буду очень благодарен. Заранее спасибо.

ответ

0

Функциональная подпись для add_core_q принимает значение Core &. Вы проходите через std :: unique_ptr.

0

Ваши объекты Core хранятся внутри unique_ptr, но ваш метод add_core_q требует ссылки на Core.

Вы можете получить сырой указатель из unique_ptr и разыменовывания него, который позволил бы вам сделать это:

add_core_q(*(vCore[0])); 

Однако вы также будете иметь проблемы с методом get_core_q, поскольку он возвращает копию основного объекта, а не ссылку на ядро, хранящееся в unique_ptr.

Лично я просто обошел указатели, а не разыгрывал вещи.Таким образом, вы бы изменить метод add_core_q принять сырой указатель:

void add_core_q(Core* p){ disp_core_queue.push(p); } 

Что вы будете использовать, как это:

add_core_q(vCore[0].get()); 

Вы бы также должны изменить свою очередь для хранения указателей, а не сами объекты:

std::queue<Core*> disp_core_queue; 

И вам нужно будет изменить возвращаемый тип метода get указателю.

Core* get_core_q(){ return disp_core_queue.front(); } 

Хотя, если вы более комфортно со ссылками вы можете вернуть ссылку вместо:

Core& get_core_q(){ return *(disp_core_queue.front()); } 
+0

Я попробовал ваш подход, но GCC не согласится. Во время компиляции выдается ошибка на * stl_deque.h *. ** typedef _Deque_iterator <_Tp, _Tp &, _Tp *> iterator; ** Это происходит, когда я меняю свою очередь на сохранение ссылок. – tVl4dimir

+0

Я сожалею об этом, у меня был глупый момент, это должна быть очередь указателей. Я изменил ответ. – Fibbles

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