skystrife / procxx

A simple process management library for C++ on UNIX platforms.
MIT License
144 stars 28 forks source link

append_arguments not work with std::list #16

Closed st-1dev closed 4 years ago

st-1dev commented 7 years ago

Hello. I have this bug on compilation. I want add arguments from list to process object.

    using Process = procxx::process;

    const std::vector<std::string> arguments = { "arg1", "arg2" };
    Process process("./run.sh");
    process.append_arguments(arguments.begin(), arguments.end());
    process.exec();

And I have this error message

In file included from /usr/include/c++/4.9/string:52:0,
                 from /usr/include/c++/4.9/bits/locale_classes.h:40,
                 from /usr/include/c++/4.9/bits/ios_base.h:41,
                 from /usr/include/c++/4.9/ios:42,
                 from /usr/include/c++/4.9/istream:38,
                 from /usr/include/c++/4.9/fstream:38,
                 from /home/<>/project/sources/main.cpp:2:
/usr/include/c++/4.9/bits/basic_string.h: In instantiation of ‘static void std::basic_string<_CharT, _Traits, _Alloc>::_S_copy_chars(_CharT*, _Iterator, _Iterator) [with _Iterator = __gnu_cxx::__normal_iterator<const std::basic_string<char>*, std::vector<std::basic_string<char> > >; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’:
/usr/include/c++/4.9/bits/basic_string.tcc:140:51:   required from ‘static _CharT* std::basic_string<_CharT, _Traits, _Alloc>::_S_construct(_InIterator, _InIterator, const _Alloc&, std::forward_iterator_tag) [with _FwdIterator = __gnu_cxx::__normal_iterator<const std::basic_string<char>*, std::vector<std::basic_string<char> > >; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
/usr/include/c++/4.9/bits/basic_string.h:1742:56:   required from ‘static _CharT* std::basic_string<_CharT, _Traits, _Alloc>::_S_construct_aux(_InIterator, _InIterator, const _Alloc&, std::__false_type) [with _InIterator = __gnu_cxx::__normal_iterator<const std::basic_string<char>*, std::vector<std::basic_string<char> > >; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
/usr/include/c++/4.9/bits/basic_string.h:1763:58:   required from ‘static _CharT* std::basic_string<_CharT, _Traits, _Alloc>::_S_construct(_InIterator, _InIterator, const _Alloc&) [with _InIterator = __gnu_cxx::__normal_iterator<const std::basic_string<char>*, std::vector<std::basic_string<char> > >; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
/usr/include/c++/4.9/bits/basic_string.tcc:229:49:   required from ‘std::basic_string<_CharT, _Traits, _Alloc>::basic_string(_InputIterator, _InputIterator, const _Alloc&) [with _InputIterator = __gnu_cxx::__normal_iterator<const std::basic_string<char>*, std::vector<std::basic_string<char> > >; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
/usr/include/c++/4.9/bits/vector.tcc:345:16:   required from ‘void std::vector<_Tp, _Alloc>::_M_insert_aux(std::vector<_Tp, _Alloc>::iterator, _Args&& ...) [with _Args = {__gnu_cxx::__normal_iterator<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >&, __gnu_cxx::__normal_iterator<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >&}; _Tp = std::basic_string<char>; _Alloc = std::allocator<std::basic_string<char> >; std::vector<_Tp, _Alloc>::iterator = __gnu_cxx::__normal_iterator<std::basic_string<char>*, std::vector<std::basic_string<char> > >; typename std::_Vector_base<_Tp, _Alloc>::pointer = std::basic_string<char>*]’
/usr/include/c++/4.9/bits/vector.tcc:314:34:   required from ‘std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::emplace(std::vector<_Tp, _Alloc>::const_iterator, _Args&& ...) [with _Args = {__gnu_cxx::__normal_iterator<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >&, __gnu_cxx::__normal_iterator<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >&}; _Tp = std::basic_string<char>; _Alloc = std::allocator<std::basic_string<char> >; std::vector<_Tp, _Alloc>::iterator = __gnu_cxx::__normal_iterator<std::basic_string<char>*, std::vector<std::basic_string<char> > >; typename std::_Vector_base<_Tp, _Alloc>::pointer = std::basic_string<char>*; std::vector<_Tp, _Alloc>::const_iterator = __gnu_cxx::__normal_iterator<const std::basic_string<char>*, std::vector<std::basic_string<char> > >; typename __gnu_cxx::__alloc_traits<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type>::const_pointer = const std::basic_string<char>*]’
/home/<>/cmake-build-debug/include/process.h:458:9:   required from ‘void procxx::process::append_arguments(InputIterator, InputIterator) [with InputIterator = __gnu_cxx::__normal_iterator<const std::basic_string<char>*, std::vector<std::basic_string<char> > >]’
/home/<>/sources/main.cpp:96:64:   required from here
/usr/include/c++/4.9/bits/basic_string.h:389:37: error: no matching function for call to ‘std::char_traits<char>::assign(char&, const std::basic_string<char>&)’
      traits_type::assign(*__p, *__k1); // These types are off.
                                     ^
/usr/include/c++/4.9/bits/basic_string.h:389:37: note: candidates are:
In file included from /usr/include/c++/4.9/ios:40:0,
                 from /usr/include/c++/4.9/istream:38,
                 from /usr/include/c++/4.9/fstream:38,
                 from /home/<>/sources/main.cpp:2:
/usr/include/c++/4.9/bits/char_traits.h:242:7: note: static void std::char_traits<char>::assign(std::char_traits<char>::char_type&, const char_type&)
       assign(char_type& __c1, const char_type& __c2) _GLIBCXX_NOEXCEPT
       ^
/usr/include/c++/4.9/bits/char_traits.h:242:7: note:   no known conversion for argument 2 from ‘const std::basic_string<char>’ to ‘const char_type& {aka const char&}’
/usr/include/c++/4.9/bits/char_traits.h:278:7: note: static std::char_traits<char>::char_type* std::char_traits<char>::assign(std::char_traits<char>::char_type*, std::size_t, std::char_traits<char>::char_type)
       assign(char_type* __s, size_t __n, char_type __a)
       ^
/usr/include/c++/4.9/bits/char_traits.h:278:7: note:   candidate expects 3 arguments, 2 provided
make[2]: *** [CMakeFiles/<>/sources/main.cpp.o] Ошибка 1
make[1]: *** [CMakeFiles/<>/all] Ошибка 2
VoltairesPuppet commented 6 years ago

You have probably figured this out by now, but it looks like it performs and emplace(), so requires non-const container and iterator. Remove the const before std::vector<> and think you will find it works.