【问题标题】:How to store inside a queue a unique_ptr of object which is located inside a vector如何在队列中存储位于向量内的对象的 unique_ptr
【发布时间】:2015-12-14 11:59:15
【问题描述】:

所以我正在构建一个模拟器来模拟一些负载平衡算法。我创建了 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(); }

当程序初始化时,我会像这样填充核心和显示:

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

我的问题是我无法从向量中获取核心并将其存储在调度程序的队列中。我尝试了很多方法,但似乎 C++ 出于各种原因惩罚了我。我的最后一次尝试是 Dispatcher 内部的这个:

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

编译时出现这个错误:

错误:没有匹配函数调用'Dispatcher::add_core_q(_gnu_cxx::__alloc_traits >>::value_type&)'

候选人是:

void Dispatcher::add_core_q(Core&)

没有已知的参数 1 从 '__gnu_cxx::__alloc_traits >>::value_type {aka std::unique_ptr}' 到 'Core&' 的转换

如果有人能给我一个提示,我将不胜感激。提前致谢。

【问题讨论】:

    标签: c++ c++11 vector queue unique-ptr


    【解决方案1】:

    add_core_q 的函数签名采用 Core&。 您正在传递一个 std::unique_ptr。

    【讨论】:

      【解决方案2】:

      您的核心对象存储在 unique_ptr 中,但您的 add_core_q 方法需要核心引用。

      您可以从 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()); }
      

      【讨论】:

      • 我试过你的方法,但 gcc 不同意。在编译期间在 stl_deque.h 处引发错误。 typedef _Deque_iterator<_tp _tp> iterator; 当我将队列更改为存储引用时会发生这种情况。
      • 是的,对不起,我有一个愚蠢的时刻,它应该是一个指针队列。我已经修改了答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多