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

confusion between std::[tr1::]ref and boost::ref

提问人:sbi 提问时间:12/12/2013 更新时间:12/12/2013 访问量:281

问:

注意:这是 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 查找击中我们。但是,我对如何规避这个问题缺乏想法。

有人在那里吗?

C++ 提升 绑定 TR1

评论

1赞 Simple 12/12/2013
你的代码中缺少是故意的吗?ref
1赞 sbi 12/12/2013
@Simple:你认为哪里有不足?ref
0赞 Simple 12/12/2013
您的两个代码示例没有调用 ,而错误有。我问这是不是故意的。通过你提到的 ADL,我不确定。ref
0赞 sbi 12/12/2013
@Simple:在实现的深处,使用 a 作为参数进行非限定调用。Koenig 查找似乎与此调用一样匹配。因此出现错误。无论如何,Dietmar 采用特殊重载的好主意解决了这个问题。std::tr1::bindref()boost::anyboost::ref()std::tr1::ref()
0赞 Dietmar Kühl 12/12/2013
@sbi:实现似乎使用了不合格的 .如果它使用,它应该真正限定它。ref()ref()

答:

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);
    }
}