vendredi 25 décembre 2015

unique_ptr and specifying deconstructors

When compiling my program with clang++ --std=c++11 file.cpp the line std::unique_ptr<FILE> pipe(popen(cmd.c_str(), "r"), pclose); throws the error

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.

If I switch from a unique_ptr to a shared_ptr my program compiles. Why does one constructor work and one not, and how do I fix it?

Aucun commentaire:

Enregistrer un commentaire