C++ std::[tr1::]ref和boost::ref之间的混淆
注意:这是GCC 4.1.2。我们在一个专有的嵌入式平台上。我们无法更新到新的编译器。所以C++03+TR1就是这样 我们有这样一个函数:C++ std::[tr1::]ref和boost::ref之间的混淆,c++,boost,bind,tr1,C++,Boost,Bind,Tr1,注意:这是GCC 4.1.2。我们在一个专有的嵌入式平台上。我们无法更新到新的编译器。所以C++03+TR1就是这样 我们有这样一个函数: template<typename T> void foo(const boost::any& x) { bar(boost::any_cast<T>(x)); } 模板 void foo(const boost::any&x) { bar(boost::any_cast(x)); } 然后在绑定表达式中使用: std
template<typename T>
void foo(const boost::any& x)
{
bar(boost::any_cast<T>(x));
}
模板
void foo(const boost::any&x)
{
bar(boost::any_cast(x));
}
然后在绑定表达式中使用:
std::tr1::bind( &foo<T>, _1);
std::tr1::bind(&foo,_1);
这将生成以下错误:
错误:重载“ref(const boost::any&)”的调用不明确
注:候选项为:std::tr1::reference\u wrapper std::tr1::ref(_Tp&)[带_Tp=const boost::any]
注意:常数boost::reference_包装器boost::ref(T&)[带T=常数boost::any]
我知道这是Koenig打来的。然而,我对如何规避这个问题缺乏想法
外面有人吗 定义一个版本的
boost::ref()
特别是使用boost::any
并让它返回正确的类型。大概
namespace boost {
std::tr1::reference_wrapper<boost::any const>
ref(boost::any const& o) {
return std::tr1::ref(o);
}
}
namespace boost{
std::tr1::引用\u包装器
参考(增压:任何常量和o){
返回std::tr1::ref(o);
}
}
您的代码中缺少ref
是故意的吗?@很简单:您在哪里看到缺少ref
?您的两个代码示例没有调用ref
,而错误确实存在。我在问这是否是故意的。您提到ADL时,我不确定。@很简单:在std::tr1::bind
的实现中,对ref()
的非限定调用是以boost::any
作为参数进行的。Koenig查找似乎使此调用的boost::ref()
与std::tr1::ref()
匹配得一样好。因此出现了错误。无论如何,Dietmar使用特殊重载的好主意解决了这个问题。@sbi:实现似乎使用了非限定的ref()
,这似乎有些奇怪。如果它使用ref()。