所以我正在进行从具有垃圾收集功能的OO语言到C ++的转换。首先,我想将所有对象包装在共享指针中以解决内存解除分配问题。现在我试图将一个向量包装在共享指针中并直接初始化向量。请参阅下面的问题。为什么它不起作用,如果可能的话,我该如何使它起作用?
vector<int> vec({ 6, 4, 9 }); // Working
shared_ptr<vector<int>> vec = make_shared<vector<int>>({ 6, 4, 9 }); // Not working
很抱歉不包含错误,我收到的错误标记为(make_shared)并打印为:
no instance of function template "std::make_shared" matches the argument list
argument types are: ({...})
感谢您的回答!
答案 0 :(得分:10)
Brace初始化列表不能用于大多数类型的演绎上下文。
如果您明确指定它的工作类型:
std::shared_ptr<std::vector<int>> vec = std::make_shared<std::vector<int>>(std::vector<int>{ 6, 4, 9 });
答案 1 :(得分:2)
auto vec = make_shared<vector<int>>(std::initializer_list<int>{ 6, 4, 9 });
答案 2 :(得分:0)
初始化列表与make_shared
的效果不佳。有关详细信息,请参阅此处:std::make_shared with std::initializer_list
但可能真正的解决方案是根本不将智能指针放在智能指针中 - 不管怎样都不应该使用智能指针。但如果你想坚持下去,这应该有效:
shared_ptr<vector<int>> vec(new vector<int>({ 6, 4, 9 }));
答案 3 :(得分:0)
make_shared不支持非显式初始化列表。您可以利用auto
可以推导出初始化列表的事实:
auto init = { 6, 4, 9 };
auto vec = std::make_shared<std::vector<int>>(init);
但正如其他人所指出的,你需要考虑是否需要shared_ptr
,vector
管理自己的记忆。 shared_ptr
不是免费的。