質問

この最初の作品は、以下のエリックのコメントによって解決されていますが、私は水平方向のルールの後に記述することを第二の問題につながっています。おかげエリック!

私はファンクタには2つのパラメータと一緒にクラスthread_groupブーストのcreate_thread方法にテンプレートクラスでファンクタを渡すためにしようとしています。しかし、私は私の現在のコンパイルエラーを超えて取得するように見えることはできません。以下のコードを使用してます:

#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#include <boost/thread.hpp>
#include <vector>

using namespace boost::lambda;
using namespace std;

namespace bl = boost::lambda;

template<typename ftor, typename data>
class Foo
{
public:
    explicit Foo()
    {
    }
    void doFtor ()
    {
        _threads.create_thread(bind(&Foo<ftor, data>::_ftor, _list.begin(), _list.end()));
        //_threads.create_thread(bind(_ftor, _list.begin(), _list.end()));
        _threads.join_all();
    }

private:
    boost::thread_group _threads;
    ftor _ftor;
    vector<data> _list;
};

template<typename data>
class Ftor
{
public:
    //template <class Args> struct sig { typedef void type; }

    explicit Ftor () {}

    void operator() (typename vector<data>::iterator &startItr, typename vector<data>::iterator &endItr)
    {
        for_each(startItr, endItr, cout << bl::_1 << constant("."));
    }
}

私も、私は私の問題は、ファンクタ自体がテンプレート化されたとしてシグテンプレートとは何かを持っているかもしれないと思ったとしてtypedefは-INGの「タイプ」試してみました。

私が取得していますエラーがあります:

error: no matching function for call to ‘boost::lambda::function_adaptor<Ftor<int> Foo<Ftor<int>, int>::*>::apply(Ftor<int> Foo<Ftor<int>, int>::* const&, const __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int>> >&, const __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >&)’
プリアンブル事前の束と

任意の助けを事前に感謝!

<時間>

わかりました、私は次のコードでは結果の下にエリックの提案では、コード撮影を修正しました。

#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#include <boost/thread.hpp>
#include <vector>

using namespace boost::lambda;
using namespace std;

namespace bl = boost::lambda;

template<typename ftor, typename data>
class Foo
{
public:
    explicit Foo()
    {
    }
    void doFtor ()
    {
        _threads.create_thread(bl::bind(boost::ref(_ftor), _list.begin(), _list.end()));
        _threads.join_all();
    }

private:
    boost::thread_group _threads;
    ftor _ftor;
    vector<data> _list;
};

template<typename data>
class Ftor
{
public:
    typedef void result_type;

    explicit Ftor () {}

    result_type operator() (typename vector<data>::iterator &startItr, typename vector<data>::iterator &endItr)
    {
        for_each(startItr, endItr, cout << bl::_1 << constant("."));
        return ;
    }
};

別のコンパイルエラーが発生しかし、この結果ます:

/usr/local/include/boost/lambda/detail/function_adaptors.hpp:45: error: no match for call to ‘(Ftor<int>) (const __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >&, const __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >&)’
ftor.h:41: note: candidates are: void Ftor<data>::operator()(typename std::vector<data, std::allocator<_CharT> >::iterator&, typename std::vector<data, std::allocator<_CharT> >::iterator&) [with data = int]
/usr/local/include/boost/lambda/detail/function_adaptors.hpp:45: error: return-statement with a value, in function returning 'void'

今何かを返すために)(演算子を期待しているのresult_typeとして、ボイド定義されたようです。私は、関数内からのresult_typeが、これも生成されたエラーを返してみました。任意のアイデア?

役に立ちましたか?

解決

Sig(またはあなたのケースでは、単にtypedef void result_type;が必要です。

IIRC、ラムダ::バインドは、その引数のconstのコピーを作成します。

非const演算子(とファンクタでの問題は)このようにしてあります。これはFtor ::演算子()CONSTすることによって解決されるまたは(doFtor())に巻き付けることによって、ブースト_ftor :: REF

イテレータと同様の問題があります。それは一時的なへの参照を使用して終了になるので、ブースト:: refの中にラッピングは、ここでは直接動作しません。簡単な解決策は、コピーすることによって、その引数を取るようにFtor ::演算子()を変更することです。

最も簡単なのはFtorを変更することがあるので、そのオペレータは()constはが、それはコピーすることによって、その引数を取ることである。

void operator() (typename vector<data>::iterator startItr, typename vector<data>::iterator endItr)const

あなたが本当にFtor ::演算子()constのを作ることができない場合は、次のようにdoFtorを()修正することができる(Ftorを作ることが必要である::演算子()コピーすることによって、その引数を取る):

_threads.create_thread(bind(boost::ref(_ftor), _list.begin(), _list.end()));
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top