
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
Страницы: (78) « Первая ... 33 34 [35] 36 37 ... 77 78 ( Перейти к последнему сообщению ) |
Сообщ.
#511
,
|
|
|
Flex Ferrum, на последней вашей сборке тоже не компилится. В thread есть такая директива препроцессора
![]() ![]() #if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1) Как я понял, она есть false, и код с классом thread просто не существует при компиляции. |
Сообщ.
#512
,
|
|
|
Цитата MyNameIsIgor @ Как я понял, она есть false, и код с классом thread просто не существует при компиляции. Ну, одно из двух. Либо не поправили, либо есть некие ключи конфигурации, которые можно выставить (при сборке), чтобы это заработало. |
Сообщ.
#513
,
|
|
|
Цитата Flex Ferrum @ либо есть некие ключи конфигурации, которые можно выставить (при сборке) При сборке MinGW? |
Сообщ.
#514
,
|
|
|
Цитата MyNameIsIgor @ При сборке MinGW? Ну да. |
Сообщ.
#515
,
|
|
|
Flex Ferrum, ясно. Значит, придётся ставить эксперименты самому
![]() |
Сообщ.
#516
,
|
|
|
Цитата MyNameIsIgor @ Flex Ferrum, на последней вашей сборке тоже не компилится. В thread есть такая директива препроцессора ![]() ![]() #if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1) Как я понял, она есть false, и код с классом thread просто не существует при компиляции. в каком файле? |
Сообщ.
#517
,
|
|
|
niXman, там же написано - во thread
![]() Не помню точно путь в винде, но судя по линухе - includes/c++/4.5.0/thread |
Сообщ.
#518
,
|
|
|
Цитата MyNameIsIgor @ там же написано - во thread я изначально не понял, это в бустовских или компилятора хидерах. |
Сообщ.
#519
,
|
|
|
Не до конца понимаю варианты использования lambda-функции в новом стандарте. Если я хочу объявить multimap с компаратором в виде lambda-функции, то по идее код будет примерно следующим:
![]() ![]() struct A { int i; }; std::multimap<int, A, [](A a1, A a2) -> bool {return a1.i < a2.i; } > m; Но компилятор (intel c++ 12 beta с ключём -std=c++0x), который запросто воспринимает lambda в других местах, в таком объявлении не понимает синтаксиса. Возможно ли такое использование lambda-функций? |
Сообщ.
#520
,
|
|
|
ShapovalovTS, аргументом шаблона должен быть тип компаратора, а данное выражение
![]() ![]() [](A a1, A a2) -> bool {return a1.i < a2.i; } создаёт, как я понимаю, именно экземпляр лямбды. И, кстати, в данном случае не обязательно указывать возвращаемый лямбдой тип. Для получения типа лямбды можно использовать decltype как-то так: ![]() ![]() auto f = [](A a1, A a2) {return a1.i < a2.i; }; std::multimap<int, A, decltype(f)> m(f); Поскольку для лямбд не гарантируется наличие конструктора по умолчанию, то мы передаём экземпляр лямбды в конструктор multimap'а. Добавлено Кстати, только сейчас заметил ![]() |
Сообщ.
#521
,
|
|
|
MyNameIsIgor, спасибо за ответ, в таком виде компилятор код воспринимает. Со сравнением int-ов - тоже верное замечание.
А есть ли в этом случае способ в новом стандарте заменить auto f на что-то типа typedef <lambda-expr> f; в объявлении класса, иначе приходится выносить этот код на уровень выше, чего делать не хотелось бы. |
Сообщ.
#522
,
|
|
|
Цитата ShapovalovTS @ А есть ли в этом случае способ в новом стандарте заменить auto f на что-то типа typedef <lambda-expr> f; в объявлении класса Я немного не понял, что вы хотите сделать. В том то и дело, что тип лямбды нам неизвестен, потому typedef мы можем сделать только с использованием decltype ![]() ![]() auto f = [](A a1, A a2) {return a1.i < a2.i; }; typedef decltype(f) some_type; Если же вам нужно, чтобы тип компаратора был виден глобально, то больше смысла будет в создании функтора, так сказать, "по-старинке", а не в использовании лямбды. Всё же лямбда - это что-то для локального использования. Добавлено Или вы хотите в таком виде? ![]() ![]() typedef decltype([](A a1, A a2) {return a1.i < a2.i; }) some_type; Тут нужно знатоков стандарта, ибо я не знаю, законна ли такая конструкция в принципе. Но у меня в gcc 4.5 она не компилировалась. И в таком случае не получится создать экземпляр этого типа. Т.е. код ![]() ![]() some_type f; не скомпилируется, потому что у лямбд нет конструктора по умолчанию. |
Сообщ.
#523
,
|
|
|
Цитата MyNameIsIgor @ Или вы хотите в таком виде? ![]() ![]() typedef decltype([](A a1, A a2) {return a1.i < a2.i; }) some_type; Да, хотелось бы не выносить тип из объявления класса, в котором идет работа с std::multimap. Мой компилятор от Intel тоже отказывается подобное компилировать: ![]() ![]() class B { struct A {int i;}; typedef decltype([](A a1, A a2) {return a1.i < a2.i; }) some_type; }; |
Сообщ.
#524
,
|
|
|
ShapovalovTS, тогда я бы сделал так
![]() ![]() class B { struct A {int i;}; struct comparator : public std::binary_function<A, A, bool> { bool operator() (const A& first, const A& second) const { return first.i < second.i; } }; std::multimap<A, int, comparator> m; }; |
Сообщ.
#525
,
|
|
|
Эммм... Что-то вы не то и не с тем мешаете.
![]() ![]() ![]() // При объявлении типа мапы: typedef std::multimap<int, A, std::function<bool (A const&, A const&)>> mmap_type; // при объявлении экземпляра мультимапы: mmap_type m([](A a1, A a2) {return a1.i < a2.i; }); Как-то так. |