参考Well, how does the custom deleter of std::unique_ptr work?
构造
std::unique_ptr<ErrorHandling> error_;
RecursiveDescentParser::RecursiveDescentParser(std::string inputStream, bool fileService,
boost::optional<std::string> filePathName, std::ofstream &writer){
if (fileService == true){
error_(new ErrorHandling(fileService, writer)); <---- compiler error
}
else{
error_(new ErrorHandling(fileService, std::ofstream())); <---- compiler error
}
}
编译器错误
Error 1 error C2247: 'std::default_delete<_Ty>::operator ()' not accessible because 'std::unique_ptr<_Ty>' uses 'private' to inherit from 'std::_Unique_ptr_base<_Ty,_Dx,_Empty_deleter>'
错误原因here。
我决定,因为'std::default_delete<_Ty>::operator ()
是private
,因为子类(在这种情况下为std::unique_ptr
)已指定private inheritance
我将编写自己的自定义删除器。问题是我对语法和符号的成功感到太不舒服了。
答案 0 :(得分:5)
这一行
error_(new ErrorHandling(fileService, writer));
是错误,因为unique_ptr
没有operator()
。错误消息有点误导,因为它的基类似乎有一个(但幸运的是私有)。
你可能打算
error_.reset(new ErrorHandling(fileService, writer));
使unique_ptr
拥有一个新对象。
答案 1 :(得分:4)
问题是你试图在unique_ptr
上使用函数调用操作符,这不是一件有效的事情。然后引起一些混乱,因为你的特定实现碰巧有一个不可访问的运算符,而不是根本没有运算符,给出了一个奇怪的错误信息。
我假设您实际上正在尝试重置error_
以拥有新指针:
error_.reset(new ErrorHandling(fileService, writer));
// ^^^^^^
更新:如果你确实想要一个自定义删除器(重申一下,你不是这种情况),它可能看起来像:
struct ErrorHandlingDeleter
{
void operator()(ErrorHandling * p) {/* do something to release the pointer */}
};
std::unique_ptr<ErrorHandling, ErrorHandlingDeleter> error;