2013-10-08 2 views
25

A.hpp:Как инициализировать std :: unique_ptr в конструкторе?

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

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

ответ

29

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

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)); 
{ } 
+2

Альтернативно вызвать сброс() 'функцию' 'на File', чтобы назначить' unique_ptr', если вам нужно сделать некоторые проверки в конструкторе заранее. – gigaplex

+0

Вам необязательно использовать список инициаторов-членов. Однако это предпочтительнее. – JohnJohn

+1

@JohnJohn, если вы используете Pimpl, вам следует использовать список инициаторов-членов, так как ваш std :: unique_ptr является const. – csguth

4

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

A:A(std::string filename) 
    : file(new std::ifstream(filename.c_str()) 
{ 
} 
Смежные вопросы