0

オブジェクトのポインターを持つベクトルがあり、新しいスレッドでオブジェクトのメソッドを起動しようとしています(メソッドにはパラメーターがあります)。

これは私がコンパイルできないコードです:

class CanaSynchDynamic {
...
    void start() (boost::barrier&);
...
};

そして主に:

for(int i=0;i<pw;++i)
    vS1.push_back(new CanaSynchDynamic());

do {
        boost::barrier barrier(pw);
        boost::thread_group threads;
        for(int i=0;i<pw;++i)
            vS1[i]->more_steps(start,s[z]);
        for(int i=0;i<pw;++i)
            threads.create_thread(boost::bind(&CanaSynchDynamic::start,boost::ref(*(vS1[i])),boost::ref(barrier)));
        threads.join_all();

} while(something);

エラーは次のとおりです。

    /usr/include/boost/thread/detail/thread.hpp: In instantiation of 'void
    boost::detail::thread_data<boost::reference_wrapper<T> >::run() [with F = CanaSynchDynamic]':
    simulation_3.cpp:278:1:   required from here
    /usr/include/boost/thread/detail/thread.hpp:98:17: error: no match for call to   '(CanaSynchDynamic) ()'

何か考えはありますか?

4

1 に答える 1

2

reference_wrapperaを使用して、関数の実行元となるオブジェクトを渡すことはできません。代わりに、オブジェクトへのポインタを渡すことができます。

threads.create_thread(boost::bind(&CanaSynchDynamic::start,vS1[i],boost::ref(barrier)));

また、オブジェクトへのポインタではなく、オブジェクトをベクトルに格納するだけの場合もあります。ポインタが必要な場合はstd::unique_ptrC++11からを使用するか、それが利用できない場合はおそらくboost::ptr_vector

于 2013-03-10T16:26:09.937 に答える