make_pair和push_back基指针并实例化基指针的向量

时间:2018-02-08 18:51:06

标签: c++ pointers

我的第一个问题是我无法实例化指针向量,第二个问题是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);


}

1 个答案:

答案 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(...)
  • 的“STL迭代器风格”

<强>更新

关于你的评论:

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()));