0

参考那么,std::unique_ptr 的自定义删除器是如何工作的呢?

构造函数

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>'

此处描述的错误原因。

我之所以决定'std::default_delete<_Ty>::operator ()private因为子类(std::unique_ptr在这种情况下)已指定private inheritance我将编写自己的自定义删除器。问题是我对语法和符号太不舒服而无法成功。

4

2 回答 2

5

这条线

error_(new ErrorHandling(fileService, writer));

是一个错误,因为unique_ptr没有operator(). 错误消息有点误导,因为它的基类似乎有一个(但幸运的是私有的)。

你可能打算

error_.reset(new ErrorHandling(fileService, writer));

这使unique_ptr自己成为一个新对象。

于 2013-04-08T16:31:17.197 回答
4

问题是您试图在 a 上使用函数调用运算符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;
于 2013-04-08T16:32:39.097 回答