我正在学习智能指针,下面的示例是test.cpp
#include<iostream>
#include<vector>
#include<memory>
struct abstractShape
{
virtual void Print() const=0;
};
struct Square: public abstractShape
{
void Print() const override{
std::cout<<"Square\n";
}
};
int main(){
std::vector<std::unique_ptr<abstractShape>> shapes;
shapes.push_back(new Square);
return 0;
}上述代码有一个编译错误"c++ -std=c++11 test.cpp":
smart_pointers_2.cpp:19:12: error: no matching member function for call to 'push_back'
shapes.push_back(new Square);有人能帮我解释一下错误吗?顺便说一句,当我将push_back改为emplace_back时,编译器只会发出警告。
发布于 2022-04-02 09:39:33
push_back需要一个std::unique_ptr,当传递像new Square这样的原始指针(被认为是复制初始化)时,原始指针需要隐式转换为std::unique_ptr。隐式转换失败,因为std::unique_ptr的原始指针转换构造函数被标记为explicit。
emplace_back之所以工作,是因为它将参数转发给std::unique_ptr的构造函数,并以直接初始化的形式构造元素,其中考虑了explicit转换构造函数。
的论点args..。作为
std::forward<Args>(args)....
转发给构造函数。
https://stackoverflow.com/questions/71716400
复制相似问题