std::function
От: regnar  
Дата: 16.06.15 23:20
Оценка: -1
Продолжаю ковырять GCC, какие-то очередные грабли:

#include <functional>
#include <algorithm>
#include <vector>

int main()
{
    std::vector<int> data;
    std::function<bool(int, int)> cmp = [](int a, int b) { return a < b; };
    std::sort(data.begin(), data.end(), cmp);
    return 0;
}


MSVC компилирует, GCC 4.8 тоже, GCC 5.1 нет. Как-нибудь можно std::function подсунуть как компаратор?
Re: std::function
От: watchyourinfo Аргентина  
Дата: 16.06.15 23:26
Оценка:
primary question: why std::function needed here at all?
Re: std::function
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 17.06.15 06:24
Оценка: 4 (2)
Здравствуйте, regnar, Вы писали:

R>MSVC компилирует, GCC 4.8 тоже, GCC 5.1 нет. Как-нибудь можно std::function подсунуть как компаратор?


Что у вас за версия 5.1?

$ g++5 -Wl,-rpath=/usr/local/lib/gcc5 regnar.cc -std=c++11
$ ./a.out 
$


скомпилировалось и запустилось (надо бы для хорошего примера ещё вывести результат сортировки, но вопрос был чисто в компиляции?)

у меня

$ g++5 -v
Using built-in specs.
COLLECT_GCC=g++5
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc5/gcc/x86_64-portbld-freebsd9.3/5.1.0/lto-wrapper
Target: x86_64-portbld-freebsd9.3
Configured with: ./../gcc-5.1.0/configure --with-build-config=bootstrap-debug --disable-nls --enable-gnu-indirect-function --libdir=/usr/local/lib/gcc5 --libexecdir=/usr/local/libexec/gcc5 --program-suffix=5 --with-as=/usr/local/bin/as --with-gmp=/usr/local --with-gxx-include-dir=/usr/local/lib/gcc5/include/c++/ --with-ld=/usr/local/bin/ld --with-libiconv-prefix=/usr/local --with-pkgversion='FreeBSD Ports Collection' --with-system-zlib --disable-libgcj --enable-languages=c,c++,objc,fortran --prefix=/usr/local --localstatedir=/var --mandir=/usr/local/man --infodir=/usr/local/info/gcc5 --build=x86_64-portbld-freebsd9.3
Thread model: posix
gcc version 5.1.0 (FreeBSD Ports Collection)
The God is real, unless declared integer.
Re[2]: std::function
От: Ops Россия  
Дата: 17.06.15 06:27
Оценка: +1
Здравствуйте, watchyourinfo, Вы писали:

W>primary question: why std::function needed here at all?


Думаю, это просто минимальный код, демонстрирующий ошибку.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re: std::function
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 17.06.15 09:55
Оценка: +1
Здравствуйте, regnar, Вы писали:

R>MSVC компилирует, GCC 4.8 тоже, GCC 5.1 нет. Как-нибудь можно std::function подсунуть как компаратор?


Текст ошибки было бы неплохо увидеть для понимания.
Re[2]: std::function
От: andyp  
Дата: 17.06.15 10:16
Оценка: 1 (1)
Здравствуйте, Nuzhny, Вы писали:

N>Текст ошибки было бы неплохо увидеть для понимания.


#include <iostream>

#include <functional>
#include <algorithm>
#include <vector>

int main()
{
    std::vector<int> data {5,4,3,2,1};
    std::function<bool(int, int)> cmp = [](int a, int b) { return a < b; };
    std::sort(data.begin(), data.end(), cmp);
    
    for (auto a : data)
        std::cout << a << std::endl;
    return 0;
}


Вот что говорит http://coliru.stacked-crooked.com/

  Много букв

In file included from /usr/local/include/c++/5.1.0/bits/stl_algobase.h:71:0,

from /usr/local/include/c++/5.1.0/bits/char_traits.h:39,

from /usr/local/include/c++/5.1.0/ios:40,

from /usr/local/include/c++/5.1.0/ostream:38,

from /usr/local/include/c++/5.1.0/iostream:39,

from main.cpp:1:

/usr/local/include/c++/5.1.0/bits/predefined_ops.h: In instantiation of 'constexpr bool __gnu_cxx::__ops::_Iter_comp_iter<_Compare>::operator()(_Iterator1, _Iterator2) [with _Iterator1 = int; _Iterator2 = int; _Compare = std::function<bool(int, int)>]':

/usr/local/include/c++/5.1.0/functional:1982:6: required by substitution of 'template<class _Res, class ... _ArgTypes> template<class _Functor> using _Invoke = decltype (std::__callable_functor(declval<_Functor&>())((declval<_ArgTypes>)()...)) [with _Functor = __gnu_cxx::__ops::_Iter_comp_iter<std::function<bool(int, int)> >; _Res = bool; _ArgTypes = {int, int}]'

/usr/local/include/c++/5.1.0/functional:1992:56: required by substitution of 'template<class _Res, class ... _ArgTypes> template<class _Functor> using _Callable = std::__and_<std::function<_Res(_ArgTypes ...)>::_NotSelf<_Functor>, std::__check_func_return_type<std::function<_Res(_ArgTypes ...)>::_Invoke<_Functor>, _Res> > [with _Functor = __gnu_cxx::__ops::_Iter_comp_iter<std::function<bool(int, int)> >; _Res = bool; _ArgTypes = {int, int}]'

/usr/local/include/c++/5.1.0/functional:2057:9: required by substitution of 'template<class _Functor, class> std::function<_Res(_ArgTypes ...)>::function(_Functor) [with _Functor = __gnu_cxx::__ops::_Iter_comp_iter<std::function<bool(int, int)> >; <template-parameter-1-2> = <missing>]'

/usr/local/include/c++/5.1.0/bits/predefined_ops.h:130:46: required from 'constexpr __gnu_cxx::__ops::_Iter_comp_iter<_Compare> __gnu_cxx::__ops::__iter_comp_iter(_Compare) [with _Compare = std::function<bool(int, int)>]'

/usr/local/include/c++/5.1.0/bits/stl_algo.h:4729:70: required from 'void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = __gnu_cxx::__normal_iterator<int*, std::vector<int> >; _Compare = std::function<bool(int, int)>]'

main.cpp:11:44: required from here

/usr/local/include/c++/5.1.0/bits/predefined_ops.h:123:31: error: invalid type argument of unary '*' (have 'int')

{ return bool(_M_comp(*__it1, *__it2)); }

^

/usr/local/include/c++/5.1.0/bits/predefined_ops.h:123:39: error: invalid type argument of unary '*' (have 'int')

{ return bool(_M_comp(*__it1, *__it2)); }



Неправильно определяет типы аргументов при инстанциировании шаблонов. Такого быть не должно. После обертки в std::function вполне себе получается BinaryPredicate.
Re[2]: std::function
От: regnar  
Дата: 17.06.15 10:30
Оценка:
Здравствуйте, netch80, Вы писали:

О, спасибо — дело оказалось в ключике -std=c++11 С этим компилирует, а с -std=c++1y и -std=c++14 нет.

  Выхлоп
In file included from /usr/local/include/c++/5.1.0/bits/stl_algobase.h:71:0,

from /usr/local/include/c++/5.1.0/bits/char_traits.h:39,

from /usr/local/include/c++/5.1.0/string:40,

from /usr/local/include/c++/5.1.0/stdexcept:39,

from /usr/local/include/c++/5.1.0/array:38,

from /usr/local/include/c++/5.1.0/tuple:39,

from /usr/local/include/c++/5.1.0/functional:55,

from test.cpp:1:

/usr/local/include/c++/5.1.0/bits/predefined_ops.h: In instantiation of 'constexpr bool __gnu_cxx::__ops::_Iter_comp_iter<_Compare>::operator()(_Iterator1, _Iterator2) [with _Iterator1 = int; _Iterator2 = int; _Compare = std::function<bool(int, int)>]':

/usr/local/include/c++/5.1.0/functional:1982:6: required by substitution of 'template<class _Res, class ... _ArgTypes> template<class _Functor> using _Invoke = decltype (std::__callable_functor(declval<_Functor&>())((declval<_ArgTypes>)()...)) [with _Functor = __gnu_cxx::__ops::_Iter_comp_iter<std::function<bool(int, int)> >; _Res = bool; _ArgTypes = {int, int}]'

/usr/local/include/c++/5.1.0/functional:1992:56: required by substitution of 'template<class _Res, class ... _ArgTypes> template<class _Functor> using _Callable = std::__and_<std::function<_Res(_ArgTypes ...)>::_NotSelf<_Functor>, std::__check_func_return_type<std::function<_Res(_ArgTypes ...)>::_Invoke<_Functor>, _Res> > [with _Functor = __gnu_cxx::__ops::_Iter_comp_iter<std::function<bool(int, int)> >; _Res = bool; _ArgTypes = {int, int}]'

/usr/local/include/c++/5.1.0/functional:2057:9: required by substitution of 'template<class _Functor, class> std::function<_Res(_ArgTypes ...)>::function(_Functor) [with _Functor = __gnu_cxx::__ops::_Iter_comp_iter<std::function<bool(int, int)> >; <template-parameter-1-2> = <missing>]'

/usr/local/include/c++/5.1.0/bits/predefined_ops.h:130:46: required from 'constexpr __gnu_cxx::__ops::_Iter_comp_iter<_Compare> __gnu_cxx::__ops::__iter_comp_iter(_Compare) [with _Compare = std::function<bool(int, int)>]'

/usr/local/include/c++/5.1.0/bits/stl_algo.h:4729:70: required from 'void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = __gnu_cxx::__normal_iterator<int*, std::vector<int> >; _Compare = std::function<bool(int, int)>]'

test.cpp:9:41: required from here

/usr/local/include/c++/5.1.0/bits/predefined_ops.h:123:31: error: invalid type argument of unary '*' (have 'int')

{ return bool(_M_comp(*__it1, *__it2)); }

^

/usr/local/include/c++/5.1.0/bits/predefined_ops.h:123:39: error: invalid type argument of unary '*' (have 'int')

{ return bool(_M_comp(*__it1, *__it2)); }
Re[3]: std::function
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 19.06.15 08:20
Оценка:
Здравствуйте, regnar, Вы писали:

R>О, спасибо — дело оказалось в ключике -std=c++11 С этим компилирует, а с -std=c++1y и -std=c++14 нет.


А как надо переделать для 14?
The God is real, unless declared integer.
Re[4]: std::function
От: regnar  
Дата: 19.06.15 21:45
Оценка:
Здравствуйте, netch80, Вы писали:

N>А как надо переделать для 14?


Я особенно не разбирался, просто завернул function в лямбду, мне не критично.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.