2015-09-17 22 views
1

因此,我構建了一個模擬器以模擬一些負載平衡算法。我已經創建磁芯和調度員的2個向量,如下所示:如何在隊列中存儲位於矢量內的對象的unique_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並將其存儲在Dispatcher隊列中。我嘗試了很多方法,但似乎C++出於各種原因懲罰了我。我最後一次嘗試是這樣一個從內部調度員:

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

這給了這個錯誤在編譯時:

錯誤:調用「調度員:: add_core_q不匹配功能(_gnu_cxx :: __ alloc_traits> > :: value_type的&)'

候選人是:

無效調度::廣告d_core_q(核心&)

用於從參數1沒有已知的轉化 '__gnu_cxx :: __ alloc_traits>> :: VALUE_TYPE {又名的std ::的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中的Core的引用。

就我個人而言,我只是傳遞指針而不是解引用事物。所以,你會改變你的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 *>迭代器; ** 發生這種情況時,我更改我的隊列以存儲引用。 – tVl4dimir

+0

對不起,我當時有一個愚蠢的時刻,應該是一個指針隊列。我已經修改了答案。 – Fibbles

相關問題