c++ - unique_ptr 和指定解构函数

标签 c++ c++11 smart-pointers unique-ptr

clang++ --std=c++11 file.cpp 编译我的程序时这条线 std::unique_ptr<FILE> pipe(popen(cmd.c_str(), "r"), pclose);抛出错误

memdiff.cpp:11:27: error: no matching constructor for initialization of
      'std::unique_ptr<FILE>'
    std::unique_ptr<FILE> pipe(popen(cmd.c_str(), "r"), pclose);
                          ^    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:2530:31: note:
      candidate constructor not viable: no known conversion from 'int (FILE *)'
      to 'const std::__1::default_delete<__sFILE>' for 2nd argument
    _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, typename conditional<
                              ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:2537:31: note:
      candidate constructor not viable: no known conversion from 'int (FILE *)'
      to 'typename remove_reference<deleter_type>::type' (aka
      'std::__1::default_delete<__sFILE>') for 2nd argument
    _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, typename remove_ref...
                              ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:2547:9: note:
      candidate template ignored: could not match 'unique_ptr<type-parameter-0-0,
      type-parameter-0-1>' against '__sFILE *'
        unique_ptr(unique_ptr<_Up, _Ep>&& __u,
        ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:2562:35: note:
      candidate template ignored: could not match 'auto_ptr<type-parameter-0-0>'
      against '__sFILE *'
        _LIBCPP_INLINE_VISIBILITY unique_ptr(auto_ptr<_Up>&& __p,
                                  ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:2516:49: note:
      candidate constructor not viable: requires 1 argument, but 2 were provided
    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR unique_ptr(nullptr_t) _NOEXCEPT
                                                ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:2522:40: note:
      candidate constructor not viable: requires single argument '__p', but 2
      arguments were provided
    _LIBCPP_INLINE_VISIBILITY explicit unique_ptr(pointer __p) _NOEXCEPT
                                       ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:2543:31: note:
      candidate constructor not viable: requires single argument '__u', but 2
      arguments were provided
    _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT
                              ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:2487:29: note:
      candidate constructor (the implicit copy constructor) not viable: requires
      1 argument, but 2 were provided
class _LIBCPP_TYPE_VIS_ONLY unique_ptr
                            ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:2510:49: note:
      candidate constructor not viable: requires 0 arguments, but 2 were provided
    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR unique_ptr() _NOEXCEPT
                                                ^
1 error generated.

如果我从 unique_ptr 切换到 shared_ptr,我的程序就会编译。为什么一个构造函数有效而另一个无效,我该如何解决?

最佳答案

正如第一条评论中正确指出的那样:使用 unique_ptr,必须将删除器的类型指定为第二个模板参数。

然而,它应该是一个函数指针:

std::unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd.c_str(), "r"), pclose);

关于c++ - unique_ptr 和指定解构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34468712/

相关文章:

c++ - 使用描述符为 0 的 getpeername

c++ - .c编程如何在客户端和服务器之间建立sip session

C++ 智能指针 : sharing pointers vs. 共享数据

c++ - 如何增加 std::shared 指针的所有权计数

c++ - 是否可以进行只读复制(通过引用)shared_ptr?

c++ - 关于C++中数组的一些问题

c++ - 实现镜像

c++ - std::call_once,应该什么时候用?

c++ - 将空元素添加到声明的容器而不声明元素的类型

c++ - 有没有等同于 void* 的固定大小?