web-dev-qa-db-fra.com

Comment initialiser std :: unique_ptr dans le constructeur?

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()));
}

L'erreur que j'obtiens est levée:

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

Quelqu'un at-il une idée de pourquoi cela se produit? J'ai essayé de nombreuses façons différentes pour que cela fonctionne, mais en vain.

32
user1529891

Vous devez l'initialiser via la liste membre-initialiseur :

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

Votre exemple était une tentative d'appeler operator () sur un unique_ptr Ce qui n'est pas possible.

Mise à jour: BTW, C++ 14 a std::make_unique :

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

Vous pouvez le faire comme ceci:

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