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()。エラー メッセージは少し誤解を招きます。なぜなら、その基本クラスには 1 つあるように見えるからです (ただし、幸いなことに非公開です)。

あなたはおそらく意図した

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

自分自身をunique_ptr新しいオブジェクトにします。

于 2013-04-08T16:31:17.197 に答える
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;
于 2013-04-08T16:32:39.097 に答える