Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::[tr1::]ref和boost::ref之间的混淆_C++_Boost_Bind_Tr1 - Fatal编程技术网

C++ std::[tr1::]ref和boost::ref之间的混淆

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

注意:这是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::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()。