小编Eck*_*rdN的帖子

如何构造具有唯一指针的向量

我尝试用unique_ptr 构造一个向量。但是我没有找到直接的方法。以下代码无法编译。错误是:调用 'std::__1::unique_ptr >' 的隐式删除复制构造函数:

#include <iostream>
#include <memory>
#include <utility>
#include <vector>
class test1{
public:
    test1(){};
    test1(test1&&)=default;
};

int main(int argc, const char * argv[]) {
    std::unique_ptr<test1> us(new test1());
    std::vector<std::unique_ptr<test1>> vec{move(us)};
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ initializer-list unique-ptr c++11 list-initialization

6
推荐指数
2
解决办法
4041
查看次数

使用unique_ptr作为成员的C++模板的构造函数失败

当类模板包含另一个类的unique_ptr时,该类的构造函数不会将unique_ptr移动到新的Object中.使用相同的类,但没有模板,构造函数按预期生成对象.

#include <iostream>
class test1{
public:
    std::string s_;
    test1(std::string s):s_(s){};
};
class testu{
public:
    std::unique_ptr<test1> us_;
    testu(std::unique_ptr<test1> us):us_(std::move(us)){};
};

template <int i>
class testt {
public:
    std::unique_ptr<test1> us_;
    testt<i>(std::unique_ptr<test1> us):us_(std::move(us)){};
};

template class testt<0>;

int main(int argc, const char * argv[]) {
    //without template
    std::unique_ptr<test1> us(new test1("test"));
    testu* t1=new testu(move(us));
    std::cout<<t1->us_->s_<<"\n";

    //with template the constructor fails!
    std::unique_ptr<test1> ust(new test1("test"));
    testt<0>* t2=new testt<0>(std::move(us));
    std::cout<<t2->us_->s_<<"\n";  //crash!
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++

4
推荐指数
1
解决办法
129
查看次数