Краткая версия моего вопроса:
Этот код вызывает сбой компилятора.
pThread[0] = new boost::thread(
boost::bind(
&cGridAnimator::DoJob, // member function
this ), // instance of class
0 ); // job number
Компилятор падает при попытке скомпилировать этот код. (При запуске этого кода происходит сбой не моей программы!)
Что нужно исправить?
Длинная версия вопроса
Я делю работу над большой трехмерной сеткой на 8 отдельных заданий для выполнения в отдельных потоках, чтобы использовать преимущества 8-ядерного компьютера.
Это прекрасно работает:
JOB_LOOP {
pThread[kjob] = new boost::thread( ::DoJob, kjob );
}
Глобальная бесплатная функция DoJob считывает данные из глобального экземпляра cGridAnimator в соответствии с номером задания.
Однако мне не нравятся все эти глобальные переменные, плавающие вокруг, и мне не нравится, когда приходится использовать так много методов доступа, чтобы получить необходимые данные. Было бы намного удобнее использовать метод cGridAnimator.
Отсюда и код в верхней части этого вопроса.
Однако, когда я компилирую его в MSVC ++ 2008, компилятор выдает следующие жалобы, а затем вылетает.
1>Compiling...
1>mfm1.cpp
1>C:\Program Files\boost\boost_1_38_0\boost/bind.hpp(1643) : warning C4180: qualifier applied to function type has no meaning; ignored
1> C:\Program Files\boost\boost_1_38_0\boost/bind.hpp(1677) : see reference to class template instantiation 'boost::_bi::add_cref<Pm,I>' being compiled
1> with
1> [
1> Pm=void (__thiscall cGridAnimator::* )(int),
1> I=1
1> ]
1> .\mfm1.cpp(158) : see reference to class template instantiation 'boost::_bi::dm_result<Pm,A1>' being compiled
1> with
1> [
1> Pm=void (__thiscall cGridAnimator::* )(int),
1> A1=cGridAnimator *
1> ]
1>C:\Program Files\boost\boost_1_38_0\boost/mem_fn.hpp(318) : warning C4180: qualifier applied to function type has no meaning; ignored
1> C:\Program Files\boost\boost_1_38_0\boost/bind/bind_template.hpp(344) : see reference to class template instantiation 'boost::_mfi::dm<R,T>' being compiled
1> with
1> [
1> R=void (int),
1> T=cGridAnimator
1> ]
1>Project : error PRJ0002 : Error result 1 returned from 'C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\cl.exe'.