Какает непонятная проблема с boost::bind, туплю чёт |
Здравствуйте, гость ( Вход | Регистрация )
Какает непонятная проблема с boost::bind, туплю чёт |
Гость_Гость_Алексей_*_* |
5.7.2012, 3:43
Сообщение
#1
|
Гости |
Всем привет, особенно Iron Bug...
Вот на этой строчке выдает ошибку... (строчка вызывается в конструкторе Test) CollisionBeginContact function = boost::bind(&Test::s1, this, _1)(); Ошибка 6 error C1903: не удается восстановить после предыдущих ошибок; остановка компиляции d:\code\boost_1_49_0\boost\bind\bind.hpp 69 Ошибка 3 error C2039: result_type: не является членом "`global namespace'" d:\code\boost_1_49_0\boost\bind\bind.hpp 69 Ошибка 4 error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "type" d:\code\boost_1_49_0\boost\bind\bind.hpp 69 Ошибка 5 error C2208: boost::_bi::type: нет членов, определенных с помощью этого типа d:\code\boost_1_49_0\boost\bind\bind.hpp 69 Ошибка 2 error C2825: F: должен представлять класс или пространство имен с последующим "::" d:\code\boost_1_49_0\boost\bind\bind.hpp 69 Вывод лога построения Раскрывающийся текст 1>------ Построение начато: проект: PhusModelTest, Конфигурация: Debug Win32 ------ 1> Test.cpp 1>d:\code\project\phusmodeltest\phusmodeltest\test.cpp(28): warning C4305: аргумент: усечение из "double" к "float32" 1>d:\code\boost_1_49_0\boost\bind\bind.hpp(69): error C2825: F: должен представлять класс или пространство имен с последующим "::" 1> d:\code\boost_1_49_0\boost\bind\bind_template.hpp(15): см. ссылку на создание экземпляров класса шаблон при компиляции "boost::_bi::result_traits<R,F>" 1> with 1> [ 1> R=boost::_bi::unspecified, 1> F=void (__thiscall Test::* )(b2Fixture *,b2Fixture *,b2Contact *) 1> ] 1> d:\code\project\phusmodeltest\phusmodeltest\test.cpp(50): см. ссылку на создание экземпляров класса шаблон при компиляции "boost::_bi::bind_t<R,F,L>" 1> with 1> [ 1> R=boost::_bi::unspecified, 1> F=void (__thiscall Test::* )(b2Fixture *,b2Fixture *,b2Contact *), 1> L=boost::_bi::list2<boost::_bi::value<Test *>,boost::arg<1>> 1> ] 1>d:\code\boost_1_49_0\boost\bind\bind.hpp(69): error C2039: result_type: не является членом "`global namespace'" 1>d:\code\boost_1_49_0\boost\bind\bind.hpp(69): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "type" 1>d:\code\boost_1_49_0\boost\bind\bind.hpp(69): error C2208: boost::_bi::type: нет членов, определенных с помощью этого типа 1>d:\code\boost_1_49_0\boost\bind\bind.hpp(69): fatal error C1903: не удается восстановить после предыдущих ошибок; остановка компиляции 1> ContactListener.cpp 1> Создание кода... ========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ========== или так (тут ошибки выдаются немного иначе) CollisionBeginContact function = boost::bind(&Test::s1, this)(); Ошибка 9 error C2298: return: недопустимая операция с указателем на выражение функции-члена d:\code\boost_1_49_0\boost\bind\mem_fn.hpp 342 Вывод лога построения Раскрывающийся текст 1>------ Построение начато: проект: PhusModelTest, Конфигурация: Debug Win32 ------ 1> Test.cpp 1>d:\code\project\phusmodeltest\phusmodeltest\test.cpp(28): warning C4305: аргумент: усечение из "double" к "float32" 1>d:\code\boost_1_49_0\boost\bind\mem_fn.hpp(318): warning C4180: квалификатор, примененный к типу-функции, не имеет смысла; пропуск 1> d:\code\boost_1_49_0\boost\bind\bind_template.hpp(344): см. ссылку на создание экземпляров класса шаблон при компиляции "boost::_mfi:m<R,T>" 1> with 1> [ 1> R=void (b2Fixture *,b2Fixture *,b2Contact *), 1> T=Test 1> ] 1> d:\code\project\phusmodeltest\phusmodeltest\test.cpp(50): см. ссылку на создание экземпляров класса шаблон при компиляции "boost::_bi::bind_t<R,F,L>" 1> with 1> [ 1> R=void (&)(b2Fixture *,b2Fixture *,b2Contact *), 1> F=boost::_mfi:m<void (b2Fixture *,b2Fixture *,b2Contact *),Test>, 1> L=boost::_bi::list1<boost::_bi::value<Test *>> 1> ] 1>d:\code\boost_1_49_0\boost\bind\mem_fn.hpp(326): warning C4180: квалификатор, примененный к типу-функции, не имеет смысла; пропуск 1>d:\code\boost_1_49_0\boost\bind\mem_fn.hpp(331): warning C4180: квалификатор, примененный к типу-функции, не имеет смысла; пропуск 1>d:\code\boost_1_49_0\boost\bind\mem_fn.hpp(345): warning C4180: квалификатор, примененный к типу-функции, не имеет смысла; пропуск 1>d:\code\boost_1_49_0\boost\bind\mem_fn.hpp(350): warning C4180: квалификатор, примененный к типу-функции, не имеет смысла; пропуск 1>d:\code\boost_1_49_0\boost\bind\mem_fn.hpp(362): warning C4180: квалификатор, примененный к типу-функции, не имеет смысла; пропуск 1>d:\code\project\phusmodeltest\phusmodeltest\test.cpp(65): warning C4244: аргумент: преобразование "int" в "float32", возможна потеря данных 1>d:\code\boost_1_49_0\boost\bind\mem_fn.hpp(342): error C2298: return: недопустимая операция с указателем на выражение функции-члена 1> d:\code\boost_1_49_0\boost\bind\mem_fn.hpp(341): при компиляции функции-члена "void (&boost::_mfi:m<R,T>::operator ()(T *) const)" класса шаблон 1> with 1> [ 1> R=void (b2Fixture *,b2Fixture *,b2Contact *), 1> T=Test 1> ] 1> d:\code\boost_1_49_0\boost\bind\bind_template.hpp(344): см. ссылку на создание экземпляров класса шаблон при компиляции "boost::_mfi:m<R,T>" 1> with 1> [ 1> R=void (b2Fixture *,b2Fixture *,b2Contact *), 1> T=Test 1> ] 1> d:\code\project\phusmodeltest\phusmodeltest\test.cpp(50): см. ссылку на создание экземпляров класса шаблон при компиляции "boost::_bi::bind_t<R,F,L>" 1> with 1> [ 1> R=void (&)(b2Fixture *,b2Fixture *,b2Contact *), 1> F=boost::_mfi:m<void (b2Fixture *,b2Fixture *,b2Contact *),Test>, 1> L=boost::_bi::list1<boost::_bi::value<Test *>> 1> ] ========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ========== вырезки кода:
Чувствую что жёско туплю ща, но нечего не приходит в голову.... Жду подсказки |
|
|
Алексей1153 |
5.7.2012, 6:00
Сообщение
#2
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
|
|
|
Гость_Гость_Алексей_*_* |
5.7.2012, 6:36
Сообщение
#3
|
Гости |
что-то мне подсказывает, что функция должна быть статической неа, можно не только для статик функций.... яж не просто так this туда передаю.... а ещё - обращай внимание на warning'и , там много интересного написано бывает усечение double в float32 это печально, но там так и задумано.... и насчёт последней цитаты, читай неправильные слова, с правильным ударением |
|
|
Iron Bug |
5.7.2012, 7:34
Сообщение
#4
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
bind тут ни при чём. Алексей1153 правильно сказал, что вызов нестатической функции в конструкторе в С++ запрещён в принципе. что вызывать-то, если самого объекта ещё нет? нет виртуальной таблицы - нет и адреса функции. и пофиг, что туда передавать. поиск адреса идёт через виртуальные таблицы, которых во время работы конструктора ещё нет.
конструктору оставь его работу по инициализации, а потом уже вызывай что хочешь в какой-то отдельной функции. Сообщение отредактировал Iron Bug - 5.7.2012, 7:36 |
|
|
Гость_Гость_Алексей_*_* |
5.7.2012, 7:46
Сообщение
#5
|
Гости |
Ясно....
уже не первый раз наезжаю на похожие грабли, правд немного в другом направление..... нечему жизнь не учит ну лан вобщем спасибо за развёрнутый ответ Iron Bug и тебе спасиб Алексей1153 |
|
|
Гость_Гость_Алексей_*_* |
5.7.2012, 8:02
Сообщение
#6
|
Гости |
А вот теперь возник вопрос
Я походу достаю детскими вопросами, ну я не могу понять, если таблиц нет как я связал сигнал со слотов в этом случае, из конструктора....
код работает, почему?) |
|
|
Гость_Гость_Алексей_*_* |
5.7.2012, 8:29
Сообщение
#7
|
Гости |
Мысли в слух...
И вот ещё, таблицы составляются ведь только для виртуальных функций, а обычные доступны по суте не чем не отличаются от статичных, тока им тешиться указатель на данные объекта, тобиш этот самый this, Он в конструкторе уже доступен и пригоден к использованию....... не вижу проблемы (по крайней мере явной) использовать boost::bind(&class::funct, this); в конструкторе.... чисто по логике и как видно иногда все работает... но не всегда) мож в чём другом проблема? |
|
|
Гость_Гость_Алексей_*_* |
5.7.2012, 9:33
Сообщение
#8
|
Гости |
чёт забыл ещё отписать момент,
сделал функцию void Test::init(void) в ней вызываю ту строчку... результат тот же.... конструктор не причём ПОИСК ПРОБЛЕМЫ ПРОДОЛЖАЕТСЯ !!! |
|
|
Iron Bug |
6.7.2012, 7:49
Сообщение
#9
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
если метод не виртуальный и объект не разрушен в момент вызова сигнала, то должно работать.
например, вот это работает без проблем:
возможно, у тебя в момент вызова сигнала сам объект уже мог и не существовать. я поставила синхронизацию (через conditional_variable), чтобы убедиться, что обработка сигналов завершена к моменту выхода из главной функции (когда объект a будет разрушен). ну и компилиться это должно с мультипоточностью, естественно. иначе не будет работать. а, да... если это всё ещё проблемы компиляции, то какой компилятор юзаешь? в стандарте С++11 оператор bind стал встроенным в стандартные библиотеки и теперь у многих компиляторов есть по два варианта bind: в бусте и у себя, в стандартной поддержке. так что нужно явно указывать, какой ты бинд юзаешь. и лучше взять последний буст, ибо в каком-то из предыдущих были жёсткие глюки именно с bind, хотя это было довольно давно уже, я думаю, полгода назад, как минимум, когда стандарт только вышел. я это собирала под mingw. ща попробую в студии собрать. возможно, там может быть конфликт пространств. тогда принудительно писать boost::bind везде. P.S. в студии это тоже работает - только что проверила. Сообщение отредактировал Iron Bug - 6.7.2012, 8:49 |
|
|
Гость_Гость_Алексей_*_* |
6.7.2012, 18:06
Сообщение
#10
|
Гости |
Проблема была решена, (вчера помоем форум упал, поэтому затянул с ответом )
bind оказался тоже не причём, когда я приравниваю к функтору то происходит этот косяк... если функция без параметров то все работает как надо..... иначе печаль.... ну я прописал плейсхолдеры(вроде так называются _1, _2, _3 .. _n) равные кол-ву параметров в функторе.... и все заработало Было typedef boost::function<void(b2Fixture* this_fixture, b2Fixture* front_fixture, b2Contact* contact)> CollisionBeginContact; CollisionBeginContact function = boost::bind(&Test::s1, this); а надо было (рабочий вариант) CollisionBeginContact function = boost::bind(&Test::s1, this, _1, _2, _3); плейсхолдеры определяют связь между аргументами у оператора вызова функции связывателя и аргументами вызываемой функцией. Причем, количество аргументов у оператора вызова функции связывателя определяется количеством плейсхолдеров: Может я не до конца понимаю необходимость плейсхолдеров и каким боком они нужны здесь, когда я работал с сетью и через bind кидал функтор для обратного вызова при происхождение каких либо событий, я не прописывал плейсхолдеры.... в общем проблема решена, теперь пытаюсь понять почему Цитата в стандарте С++11 оператор bind стал встроенным в стандартные библиотеки и теперь у многих компиляторов есть по два варианта bind: в бусте и у себя, в стандартной поддержке. так что нужно явно указывать, какой ты бинд юзаешь. и лучше взять последний буст, ибо в каком-то из предыдущих были жёсткие глюки именно с bind, хотя это было довольно давно уже, я думаю, полгода назад, как минимум, когда стандарт только вышел. Не знал, спасибо за информацию.... У меня boost 1.49.0, пока не успел обновить его до boost 1.50.0, да и мне кажется в этом нет особой необходимости..... |
|
|
Текстовая версия | Сейчас: 1.12.2024, 8:17 |