web-dev-qa-db-ja.com

コンストラクタで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*)’

なぜこれが起こっているのかについての洞察はありますか?これを機能させるためにさまざまな方法を試しましたが、役に立ちませんでした。

32
user1529891

member-initializer listで初期化する必要があります:

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

あなたの例は_unique_ptr_でoperator ()を呼び出そうとしましたが、これは不可能です。

更新:ところで、C++ 14には _std::make_unique_

_A::A(std::string filename) :
    file(std::make_unique<std::ifstream>(filename));
{ }
_
37
0x499602D2

次のようにできます:

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