所以我正在构建一个模拟器,以模拟一些负载平衡算法。我创建了2个Cores和Dispatchers向量,如下所示:
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 ++因各种原因惩罚我。我最后一次尝试是来自Dispatcher的这个:
int kore = random_core();
this->add_core_q(vCore.at(kore));
在编译时出现了这个错误:
错误:没有匹配函数来调用'Dispatcher :: add_core_q(_gnu_cxx :: __ alloc_traits&gt;&gt; :: value_type&amp;)'
候选人是:
void Dispatcher :: add_core_q(Core&amp;)
来自'__gnu_cxx :: __ alloc_traits&gt;的参数1没有已知转换&gt; :: value_type {aka std :: unique_ptr}''核心&amp;'
如果有人能给我一个提示,我会非常感激。提前谢谢。
答案 0 :(得分:0)
add_core_q的函数签名正在使用Core&amp;。 您正在传递std :: unique_ptr。
答案 1 :(得分:0)
您的Core对象存储在unique_ptr中,但您的add_core_q方法需要Core引用。
您可以从unique_ptr获取原始指针并取消引用它,这将允许您执行此操作:
add_core_q(*(vCore[0]));
但是你也会遇到get_core_q方法的问题,因为它返回Core对象的副本,而不是对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()); }