我的第一个问题是我无法实例化指针向量,第二个问题是push_back不能与make_pair一起使用。有人可以帮忙吗?
错误是
no matching function for call to ‘std::unique_ptr<Base>::unique_ptr(Derived&)’
和
error: no matching function for call to ‘std::vector<std::pair<std::unique_ptr<Base>, std::unique_ptr<Base> > >::push_back(std::pair<Base*, Base*>)’
#include <vector>
#include <memory>
void someFunction(std::vector<std::unique_ptr<Base> > & vec) {
std::vector<std::unique_ptr<Base>>::iterator it = vec.begin();
std::vector<std::pair<std::unique_ptr<Base>, std::unique_ptr<Base> > > pairWise;
pairWise.push_back(std::make_pair((*it).get(), (*it).get()));
}
int main(int argc, char *argv[]) {
Base a;
std::vector<Derived> derivedObjects(2);
std::vector<std::unique_ptr<Base> > vecPtr = {derivedObjects.begin(), derivedObjects.end()};
someFunction(vecPtr);
}
答案 0 :(得分:2)
您的代码在这里:
std::vector<Derived> derivedObjects(2);
std::vector<std::unique_ptr<Base> > vecPtr = {derivedObjects.begin(), derivedObjects.end()};
不太正确。我怀疑你想使用std::vector
基于范围的构造函数将Derived
中所有derivedObjects
个对象的副本复制到std::unique_ptr<Base>
的新向量中 - 它不会work,因为std::unique_ptr<Base>
没有有效的Derived
构造函数。
其次,你使用均匀支撑初始化器还不太正确。
我怀疑你想要这个:
std::vector<Derived> derivedObjects(2);
std::vector<std::unique_ptr<Base>> vecPtr;
std::transform(derivedObjects.begin(), derivedObjects.end(), std::back_inserter(vecPtr),
[](auto& p){ return std::make_unique<Base>(p); });
这是做什么的
Derived
中的每个derivedObjects
对象调用并调用我们的lambda对象,然后将该Derived
对象转换为std::unique_ptr<Base>
并返回它。std::back_inserter
返回的迭代器(并且原因递增)。 std::back_inserter
不再是做std::vector<T, Alloc>::push_back(...)
<强>更新强>
关于你的评论:
void someFunction(std::vector<std::unique_ptr<Base> > & vec) {
std::vector<std::unique_ptr<Base>>::iterator it = vec.begin();
std::vector<std::pair<std::unique_ptr<Base>, std::unique_ptr<Base> > > pairWise;
pairWise.push_back(std::make_pair((*it).get(), (*it).get()));
}
目前还不清楚是否要将 std :: pair 或std::unique_ptr<Base>
的副本推送到pairwise
,因为std::unique_ptr
无法复制。一动不动。
如果您想移动:您可以将最后一行替换为:
pairWise.emplace_back(std::move(*it), std::move(*it));
//You shouldn't rely on the UB above of moving twice from the same object
如果它是副本(有点讨厌,因为你的设计对我来说不太好或不清楚):
pairWise.emplace_back(std::make_unique<Base>(*(*it).get()), std::make_unique<Base>(*(*it).get()));