我有一个矢量定义为:
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>'
我犯了什么错误?
答案 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;
}