2015-12-26 2 views
0

При составлении моей программы с clang++ --std=c++11 file.cpp линии std::unique_ptr<FILE> pipe(popen(cmd.c_str(), "r"), pclose); бросает ошибкуunique_ptr и задающие deconstructors

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 моя программа компилируется. Почему один конструктор работает, а другой нет, и как его исправить?

+4

С 'unique_ptr', тип Deleter должен быть указан в качестве второго параметра шаблона. Недостаточно передать его конструктору. Это должно работать: 'std :: unique_ptr pipe (..., pclose);' –

+0

Это сработало. Благодаря! – janovak

+0

* деконструкторы * пока мне действительно нравится звук этого, правильный термин все еще * деструктор * – stijn

ответ

0

Как правильно указано в первом комментарии: С уникальным_ptr тип делетера должен быть указан как второй параметр шаблона.

Однако, это должно быть функцией указателя:

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