gpt4 book ai didi

c++ - make_pair 和 push_back 基指针并实例化一个基指针 vector

转载 作者:行者123 更新时间:2023-11-30 03:25:56 25 4
gpt4 key购买 nike

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


}

最佳答案

您的代码在这里:

std::vector<Derived> derivedObjects(2);
std::vector<std::unique_ptr<Base> > vecPtr = {derivedObjects.begin(), derivedObjects.end()};

不太正确。我怀疑你想使用 std::vector的基于范围的构造函数来复制所有 Derived derivedObjects 中的对象进入 std::unique_ptr<Base> 的新 vector - 它不会工作,因为 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()));

关于c++ - make_pair 和 push_back 基指针并实例化一个基指针 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48692781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com