提问人:sbi 提问时间:12/12/2013 更新时间:12/12/2013 访问量:281
std::[tr1::]ref 和 boost::ref 之间的混淆
confusion between std::[tr1::]ref and boost::ref
问:
注意:这是 GCC 4.1.2。我们使用的是专有的嵌入式平台。我们无法更新到新的编译器。所以 C++03 + TR1 就是这样。
我们在某处有一个这样的函数:
template<typename T>
void foo(const boost::any& x)
{
bar(boost::any_cast<T>(x));
}
然后稍后在绑定表达式中使用:
std::tr1::bind( &foo<T>, _1);
这将生成以下错误:
error: call of overloaded 'ref(const boost::any&)' is ambiguous
note: candidates are: std::tr1::reference_wrapper<_Tp> std::tr1::ref(_Tp&) [with _Tp = const boost::any]
note: const boost::reference_wrapper boost::ref(T&) [with T = const boost::any]
我确实知道这是 Koenig 查找击中我们。但是,我对如何规避这个问题缺乏想法。
有人在那里吗?
答:
5赞
Dietmar Kühl
12/12/2013
#1
定义一个专门接受 a 的版本,并让它返回正确的类型。可能boost::ref()
boost::any
namespace boost {
std::tr1::reference_wrapper<boost::any const>
ref(boost::any const& o) {
return std::tr1::ref(o);
}
}
评论
ref
ref
ref
std::tr1::bind
ref()
boost::any
boost::ref()
std::tr1::ref()
ref()
ref()