C++ C+的构造函数+;具有唯一\u ptr作为成员的模板失败

C++ C+的构造函数+;具有唯一\u ptr作为成员的模板失败,c++,C++,当类模板包含另一个类的唯一\u ptr时,该类的构造函数不会将该唯一\u ptr移动到新对象中。 使用相同的类,但没有模板,构造函数按预期生成对象 #include <iostream> class test1{ public: std::string s_; test1(std::string s):s_(s){}; }; class testu{ public: std::unique_ptr<test1> us_; testu(std

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

#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;
}
#包括
类test1{
公众:
std::字符串s;
test1(std::strings):s_z(s){};
};
类测试单元{
公众:
标准:唯一的;
testu(std::unique_ptr us):us(std::move(us)){};
};
模板
类测试{
公众:
标准:唯一的;
testt(std::unique_ptr us):us(std::move(us)){};
};
模板类testt;
int main(int argc,const char*argv[]{
//无模板
标准:独特的测试(新测试1(“测试”);
testu*t1=新的testu(移动(美国));
std::couts\p>这只是一个打字错误:

testt<0>* t2 = new testt<0>(std::move(us));

修正了。

打字错误?第二段中不应该是
std::move(ust)
吗?请在move的前面添加std::in line
testu*t1=new testu(move(us))
,并且请包含和-编译器不必在头中包含它们,因此它不会与每个编译器一起编译。谢谢!我已经好几个小时没有看到这个问题了。
testt<0>* t2 = new testt<0>(std::move(ust));
std::cout<<t2->us_->s_<<"\n"; 
//             ^^^
//              | Was already moved from, access causes UB