39

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*)’

有没有人知道为什么会发生这种情况?我尝试了许多不同的方法来让它工作,但无济于事。

4

2 回答 2

50

您需要通过member-initializer list对其进行初始化:

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

你的例子是试图调用operator ()一个unique_ptr不可能的。

更新:顺便说一句,C++ 14 有std::make_unique

A::A(std::string filename) :
    file(std::make_unique<std::ifstream>(filename));
{ }
于 2013-10-08T00:41:53.843 回答
5

你可以这样做:

A:A(std::string filename)
    : file(new std::ifstream(filename.c_str())
{
}
于 2013-10-08T00:41:49.650 回答