0

誰かがこの問題で私を助けることができるかどうか疑問に思っていました. 過負荷であるため、VS2010 で std::make_pair を使用するといくつかの問題があることを読んでいますが、機能するいくつかの回避策を見つけましたが、ここで機能させる方法を見つけることができません自分。

コードの一部を以下に示します。

namespace tree {
    #define container std::vector
    typedef container<IConnType const*> node_data;

///tree node's brief
    struct tree_node
    {
        STD_STRING  name;
        node_data   types;
    };

    struct branch;
    typedef container<branch>           sub_tree;

///branch's brief
    struct branch
    {
        tree_node   node;
        sub_tree    tree;
    };
}



template<typename T>
///address of's brief
struct address_of
{
    T* operator()(T& x) const
    {
        return &x;
    }

    T const* operator()(T const& x) const
    {
        return &x;
    }
};



typedef std::pair<tree::branch*,HTREEITEM> step_info;
std::vector<step_info> steps;

/// after we fill steps ///

HTREEITEM new_item = m_conntree.InsertItem(&tvi); // m_conntree is a CTreeCtrl; tvi is a TVINSERTSTRUCT


std::transform(step.first->tree.begin()
    , step.first->tree.end()
    , std::back_inserter(steps)
    , boost::bind(&std::make_pair<tree::branch*,HTREEITEM>
        , boost::bind<tree::branch*>(address_of<tree::branch>()
            , _1
        )
    , new_item
    )
);

問題はここにあります (コードの残りの部分はアイデアを提供するためのものです):

std::transform(step.first->tree.begin()
    , step.first->tree.end()
    , std::back_inserter(steps)
    , boost::bind(&std::make_pair<tree::branch*,HTREEITEM>
        , boost::bind<tree::branch*>(address_of<tree::branch>()
            , _1
        )
    , new_item
    )
);

(他のスレッドで読んだように)キャストを試みましたが、うまくいきませんでした...これは私が試したものです:

typedef std::pair<tree::branch*,HTREEITEM> (*MakePairType)(tree::branch*,HTREEITEM);

std::transform(step.first->tree.begin()
    , step.first->tree.end()
    , std::back_inserter(steps)
    , boost::bind((MakePairType)&std::make_pair<tree::branch*,HTREEITEM>
        , boost::bind<tree::branch*>(address_of<tree::branch>()
            , _1
        )
    , new_item
    )
);

誰かがこれで私を助けてくれることを願っています...私はこのプロジェクトをコンパイルしようとして長い間立ち往生しています...

ちなみに、boost::bind (100 以上) で多くのエラーがスローされます...そしてboost::bind を取り出すと、std::make_pair のどのオーバーロードが分からないというエラーが表示されます使用する、

よろしくお願いします!

4

2 に答える 2

1

Dave S の言うとおりです。ここでは、ラムダまたはファンクターの方がはるかに優れています。あなたが直面している問題は、make_pairおそらくC++11 の重大な変更によるものです。 ペア タイプの完全な転送を有効にするために、 typeおよびmake_pairのパラメータが追加されました。T&&U&&

あなたはmake_pair次のように使用しています:

std::make_pair<tree::branch*,HTREEITEM>

tree::branch*&&テンプレート型パラメーターに明示的に名前を付けたので、パラメーター型はおよびとして選択されHTREEITEM&&ます。この関数は左辺値引数を受け入れることができません。

要するにmake_pair、明示的なテンプレート引数リストを使用して、または他の完全転送関数を使用しようとしないでください。そのように使用するようには設計されていません。

于 2012-05-22T22:38:06.263 に答える
0

まず、参照のアドレスを取得しているが、ペアが非定数ツリー::ブランチへのポインターであると予想しているため、定数に注意します。

ラムダがある場合は、次のようにします。

std::transform(step.first->tree.begin()
    , step.first->tree.end()
    , std::back_inserter(steps)
    [&](tree::branch& branch) { return std::make_pair(&branch, new_item); }
);

ラムダをサポートしていない場合は、少なくとも短期的にはファンクターを自分で記述してエラーを明確にしようとすると、より明確になる可能性があります。 boost::bindは強力ですが、失敗した場合、エラー メッセージが根本的な何かを隠してしまうことがあります。

struct make_step_info
{ 
   HTREEITEM new_item;

   make_step_info(HTREEITEM new_item): new_item(new_item)  {};

   std::pair<tree::branch*,HTREEITEM> operator()(tree::branch& branch) const
   {
      return std::make_pair(&branch, new_item);
   }
}

/* And use it here */
std::transform(step.first->tree.begin()
     , step.first->tree.end()
     , std::ba_ck_inserter(steps)
     make_step_info(new_item)
);
于 2012-05-22T22:11:10.100 に答える