Как инициализировать std :: 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*)

Кто-нибудь имеет представление о том, почему это происходит? Я пробовал много разных способов заставить это работать, но безрезультатно.

Ответы

Ответ 1

Вы должны инициализировать его через список инициаторов-членов:

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

Ваш пример был попыткой вызвать operator() на unique_ptr что невозможно.

Обновление: BTW, С++ 14 имеет std::make_unique:

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

Ответ 2

Вы можете сделать это следующим образом:

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