如何在构造函数中初始化std :: unique_ptr?

时间:2013-10-08 00:39:23

标签: c++ smart-pointers ifstream unique-ptr

A.hpp:

class A {
  private:
   std::unique_ptr<std::ifstream> file;
  public:
   A(std::string filename);
};

A.cpp:

A::A(std::string filename) {
  this->file(new std::ifstream(filename.c_str()));
}

我得到的错误是:

A.cpp:7:43: error: no match for call to ‘(std::unique_ptr<std::basic_ifstream<char> >) (std::ifstream*)’

有没有人知道为什么会这样?我已经尝试了许多不同的方法来实现这一点,但无济于事。

2 个答案:

答案 0 :(得分:37)

您需要通过成员初始化列表

初始化它
A::A(std::string filename) :
    file(new std::ifstream(filename));
{ }

您的示例是尝试在operator ()上致电unique_ptr,这是不可能的。

更新:BTW,C ++ 14有std::make_unique

A::A(std::string filename) :
    file(std::make_unique<std::ifstream>(filename));
{ }

答案 1 :(得分:5)

你可以这样做:

A:A(std::string filename)
    : file(new std::ifstream(filename.c_str())
{
}