unique_ptr 向量中的 C++ 没有重载函数错误的实例

C++ no instance of overloaded function error in vector with unique_ptr

#include <iostream>
#include <memory>
#include <vector>

using namespace std;

typedef struct _cor {
    int x;
    int y;
} COR;

int main() {
    int n;

    cin >> n;

    vector<unique_ptr<COR>> v;
    v.reserve(n);

    for (int i = 0, tmp1, tmp2; i < n; i++) {
        cin >> tmp1, tmp2;
        COR *temp = new COR{tmp1, tmp2};
        v.push_back(temp);
    }
}

我想用输入的给定数字制作一个向量

我已经将 v 向量设置为 unique_ptr<COR> 的类型,因此 v 的元素应该是一个指针。

所以我尝试了 push_back 方法来使用 new 运算符添加 COR 的新指针,但在 v.push_back(temp); says

中一直看到错误
no instance of overloaded function "std::vector<_Tp, _Alloc>::push_back [with _Tp=std::unique_ptr<COR, std::default_delete<COR>>, _Alloc=std::allocator<std::unique_ptr<COR, std::default_delete<COR>>>]" matches the argument list -- argument types are: (COR *) -- object type is: std::vector<std::unique_ptr<COR, std::default_delete<COR>>, std::allocator<std::unique_ptr<COR, std::default_delete<COR>>>>

为什么我会看到这个错误?

您需要将 unique_ptr 传输(移动)到向量槽中,而不是压入原始指针。

而不是这个:

    COR *temp = new COR{tmp1, tmp2};
    v.push_back(temp);

这个:

    std::unique_ptr<COR> uptr = unique_ptr<COR>(new COR{ tmp1, tmp2 });
    v.push_back(std::move(uptr));

或者更好的是,利用 emplace_back 进行小的优化。

    auto ptr = new COR{ tmp1, tmp2 };
    v.emplace_back(ptr);

此外,这一行看起来很可疑,并生成有关 tmp2 未初始化的编译器警告:

    cin >> tmp1, tmp2;

你的意思可能是:

    cin >> tmp1 >> tmp2;

将它们放在一起并使用 emplace 调用内联指针创建

for (int i = 0, tmp1, tmp2; i < n; i++) {
    cin >> tmp1 >> tmp2;
    v.emplace_back(new COR{ tmp1, tmp2 });
}