gpt4 book ai didi

c++ - std::make_pair 错误与 boost::bind 在 VS2010

转载 作者:行者123 更新时间:2023-11-28 08:03:55 25 4
gpt4 key购买 nike

我想知道是否有人可以帮助我解决这个问题。我一直在读到在 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 中给我带来了很多错误(超过一百个)...并且去掉了 boost::bind,它让我不知道哪个 std 重载的错误: :make_pair 使用,

此致,并提前致谢!

最佳答案

Dave S 是对的:lambda 或仿函数在这里会好得多。您在使用 make_pair 时遇到的问题可能是由于 a breaking change in C++11 . make_pair 现在有 T&&U&& 类型的参数,以实现 pair 类型的完美转发。

你像这样使用make_pair:

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

因为您已经明确命名了模板类型参数,所以参数类型选择为 tree::branch*&&HTREEITEM&&。此函数不能接受左值参数。

简而言之:不要尝试使用make_pair 或其他带有显式模板参数列表的完美转发函数;它们并非设计为以这种方式使用。

关于c++ - std::make_pair 错误与 boost::bind 在 VS2010,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10710062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com