将带有lambda的std :: shared_ptr插入到向量中

时间:2014-01-01 00:41:36

标签: c++ c++11 lambda shared-ptr stdvector

我有一个矢量定义为:

std::vector<std::shared_ptr<Orders> > vOrders;

添加到vOrders时,我想添加如下内容:

vOrders.push_back(<std::shared_ptr<Orders> >([]() {
    TimerForProcessingOrders _timerForProcessingOrders;
    _timerForProcessingOrders.detach();
}));

但是编译器给了我一个错误:

Expected expression: Expected '(' for function-style cast or type construction

<周围的>std::shared_ptr看起来很奇怪,但删除它会出错:

No matching conversion for functional-style cast from '<lambda >' to 'std::shared_ptr<Orders>'

我犯了什么错误?

3 个答案:

答案 0 :(得分:2)

这段代码的作用(以错误的方式)是由lambda构造的对象,并将lambda本身存储到向量中 - 而不是向量所需的shared_ptr<Order>类型的对象。

  

但是编译器给了我一个错误:

这是因为额外的< >语法完全无效,所以编译器给你的最好的是“无效表达式”。

  

看起来很奇怪&lt;和&gt;在std :: shared_ptr周围删除它会产生错误:
  No matching conversion for functional-style cast from '<lambda >' to 'std::shared_ptr<Orders>'

基本上你在这里的是shared_ptr<Orders>(/* .. Lambda .. */) - 并且编译器说它不知道如何将lambda变成Orders*以进入shared_ptr

你真的想在这里完成什么?

如果您只想将指针转移到shared_ptr,您可以执行类似

的操作
TimerForProcessingOrders _timerForProcessingOrders;
std::shared_ptr<Orders> ptr(_timerForProcessingOrders.detach());
vOrders.emplace_back(std::move(ptr));

不需要lambda。

答案 1 :(得分:0)

Orders是什么类型的?实际上,它并不重要:表达式[](){ ... }当然不是可转换为Orders*的类型。 ......以及push_back()参数周围的尖括号肯定是错误的。

你的意思是调用lambda表达式吗?

vOrders.push_back(std::shared_ptr<Orders>([]() {
        TimerForProcessingOrders _timerForProcessingOrders;
        return _timerForProcessingOrders.detach();
    })()
); // ^^ note these extra parenthesis

...但即使这样也不行,因为lambda表达式不会返回任何内容(因此也添加了return)。

答案 2 :(得分:0)

首先,我建议你按照Billy ONeals的思路。但是如果你想按自己的方式去做,这就是它的SSCE。

有两个变化,这个lambda返回一个对象并被执行,从而返回。

#include <vector>
#include <memory>
#include <iostream>

struct Foo {
    int val;
};

int main(int argc, char** argv) {
    std::vector<std::shared_ptr<Foo> > v;
    v.push_back([]() -> std::shared_ptr<Foo> { Foo f; f.val = 5; return std::make_shared<Foo>(f); }());
    std::cout <<v[0]->val <<std::endl;
    return 0;
}