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

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

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

最佳答案

你需要通过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));
{ }

关于c++ - 如何在构造函数中初始化 std::unique_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19237206/

相关文章:

c++ - C++ 中的 Gtkmm 进度条

c++ - 从 unique_ptr 创建 shared_ptr

c++ - 使用二进制文件填充结构

c++ - 通过引用传递值但仍然显示地址而不是值

c++ - 此函数或变量可能不安全。要禁用弃用,请使用 _CRT_SECURE_NO_WARNINGS

c++ - 有没有办法在 Eclipse 中为 C++ 启用 "Step into selection"?

c++ - 从原始指针创建 shared_ptr 的链表

c++ - 使用 BOOST shared_array 而不是 shared_ptr 的好处

c++ - 如果我想从输入文件(例如1、2、3)中读取逗号分隔的数据,包括逗号?

C++ 从文本文件创建对象