使用vector,unique_ptr和push_back时出现错误。

5

我正在学习智能指针,以下是示例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 时,编译器只给出了警告。

1个回答

7

push_back 期望一个 std::unique_ptr,当传递像 new Square 这样的原始指针时,这被视为拷贝初始化,原始指针需要隐式转换为 std::unique_ptr。由于 std::unique_ptr 的从原始指针的转换构造函数标记为显式,因此隐式转换失败。

emplace_back 可以工作是因为它将参数转发到 std::unique_ptr 的构造函数,并以直接初始化形式构造元素,该形式考虑了 explicit 转换构造函数。

参数 args... 作为 std::forward<Args>(args)... 转发到构造函数中。


谢谢!我该如何消除“emplace_back”警告?我还尝试了shapes.emplace_back(std::make_unique<Square>()),并使用了C++14。 - Memories
1
@Memories,你需要在abstractShape中添加虚析构函数,即使它是默认的也要这样做。将virtual ~abstractShape() = default;添加到该类中。这也应该能够让C++14的make_unique语义正确地连接起来。 点击查看实例 - WhozCraig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接