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 });
}
#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 });
}