Всем привет, особенно 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
Вывод лога построения
typedef boost::function<void(b2Fixture* this_fixture, b2Fixture* front_fixture, b2Contact* contact)> CollisionBeginContact;
....
void Test::s1(b2Fixture* this_fixture, b2Fixture* front_fixture, b2Contact* contact)
{
std::cout << "CollisionBeginContact: " << std::endl;
}
что-то мне подсказывает, что функция должна быть статической
а ещё - обращай внимание на warning'и , там много интересного написано бывает
bind тут ни при чём. Алексей1153 правильно сказал, что вызов нестатической функции в конструкторе в С++ запрещён в принципе. что вызывать-то, если самого объекта ещё нет? нет виртуальной таблицы - нет и адреса функции. и пофиг, что туда передавать. поиск адреса идёт через виртуальные таблицы, которых во время работы конструктора ещё нет.
конструктору оставь его работу по инициализации, а потом уже вызывай что хочешь в какой-то отдельной функции.
Ясно....
уже не первый раз наезжаю на похожие грабли, правд немного в другом направление..... нечему жизнь не учит
ну лан вобщем спасибо за развёрнутый ответ Iron Bug
и тебе спасиб Алексей1153
А вот теперь возник вопрос
Я походу достаю детскими вопросами, ну я не могу понять, если таблиц нет как я связал сигнал со слотов в этом случае, из конструктора....
Humanoid::Humanoid(boost::signal<void ()>& signalPostStep, const b2Vec2& pos, float32 width, float32 height)
{
signalPostStep.connect(boost::bind(&Humanoid::postStep, this));
}
//no static
void Humanoid::postStep()
{
}
Мысли в слух...
И вот ещё, таблицы составляются ведь только для виртуальных функций, а обычные доступны по суте не чем не отличаются от статичных, тока им тешиться указатель на данные объекта, тобиш этот самый this, Он в конструкторе уже доступен и пригоден к использованию.......
не вижу проблемы (по крайней мере явной) использовать boost::bind(&class::funct, this); в конструкторе.... чисто по логике
и как видно иногда все работает... но не всегда) мож в чём другом проблема?
чёт забыл ещё отписать момент,
сделал функцию void Test::init(void) в ней вызываю ту строчку... результат тот же.... конструктор не причём
ПОИСК ПРОБЛЕМЫ ПРОДОЛЖАЕТСЯ !!!
если метод не виртуальный и объект не разрушен в момент вызова сигнала, то должно работать.
например, вот это работает без проблем:
#include <iostream>
#include <boost/bind.hpp>
#include <boost/signal.hpp>
#include <boost/thread.hpp>
using namespace std;
using namespace boost;
class A
{
boost::condition_variable *_pcond;
boost::mutex *_pmt;
int *_pcounter;
public:
A(signal<void()>&sg,boost::condition_variable *pcond, boost::mutex *pmt, int *pcounter): _pcond(pcond), _pmt(pmt), _pcounter(pcounter)
{
sg.connect(boost::bind(&A::foo,this));
}
void func(signal<void()>&sg)
{
sg.connect(boost::bind(&A::foo,this));
}
void foo()
{
cout << "hello there! " << *_pcounter << endl;
{
boost::lock_guard<boost::mutex> lock(*_pmt);
(*_pcounter)++;
}
_pcond->notify_one();
}
};
int main()
{
boost::condition_variable cond;
boost::mutex mt;
int counter = 0;
signal<void()> sg;
A a(sg,&cond,&mt,&counter);
a.func(sg);
sg();
boost::unique_lock<boost::mutex> lock(mt);
while(counter < 2)
{
cond.wait(lock);
}
cout << "done" << endl;
return 0;
}
Проблема была решена, (вчера помоем форум упал, поэтому затянул с ответом )
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 кидал функтор для обратного вызова при происхождение каких либо событий, я не прописывал плейсхолдеры....
в общем проблема решена, теперь пытаюсь понять почему
это может быть проблемой компилятора:
Студию скачал где то пол года назат, с сайта Microsoft,
Visual Studio Express 2010, Версия 10.0.40219.1 SP1Rel тобиш бесплатная версия
версию и название компилятора чёт не нашел где глянуть...
не думаю что они устаревают так быстро, хотя может из-за того что express версия, такие проблемы.....
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)