【问题标题】:function overloading ambiguty between bool and boost::shared_ptr<base> when calling with boost::shared_ptr<derived>使用 boost::shared_ptr<derived> 调用时,bool 和 boost::shared_ptr<base> 之间的函数重载歧义
【发布时间】:2014-12-08 10:58:48
【问题描述】:
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>

struct base {};
struct derived : public base {};

void g(bool b) {}

void g(boost::shared_ptr<base> b) {}

int main()
{
    boost::shared_ptr<base> spbase = boost::make_shared<derived>();
    boost::shared_ptr<derived> spderived = boost::make_shared<derived>();

    g(true); // ok
    g(spbase); //ok
    g(boost::static_pointer_cast<base>(spderived)); // ok
    g(spderived); // I am ambiguous between g(bool b) and g(boost::shared_ptr<base> b).
}

有人可以向我解释为什么对 g(spderived) 的调用会导致 g(bool) 和 g(boost::shared_ptr) 之间出现歧义吗?

使用 gcc 版本 4.6.3 编译会出现以下错误:

$ g++ shared_test.cpp -I/c/thirdparty/boost_1_55_0/ -o shared_test shared_test.cpp:在函数'int main()'中:shared_test.cpp:27:13: 错误:重载 'g(boost::shared_ptr&)' 的调用是 模棱两可的 shared_test.cpp:27:13:注意:候选人是: shared_test.cpp:7:6: 注意: void g(bool) shared_test.cpp:9:6: 注意: void g(boost::shared_ptr)

注意:如果我添加 -std=c++11 它编译得很好,但我使用 c++98/c++03,所以这对我没有帮助。 Clang 和 VC 产生类似的错误,在 c++03 下编译。

【问题讨论】:

  • 这是 C++11 “修复”的事情之一,所以,是的,希望在 C++03 中解决它有点讨厌!这就是我们首先进行升级的原因。

标签: c++ shared-ptr overload-resolution


【解决方案1】:

在 C++03 中 shared_ptr 具有隐式布尔转换运算符,在 C++11 中它是显式的。这个调用是模棱两可的,因为在这两种情况下都会调用user-defined conversion,转换为bool,或转换为shared_ptr&lt;base&gt;,其定义如下:

template<class Y>
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )

shared_ptr( shared_ptr<Y> const & r,
typename boost::detail::sp_enable_if_convertible<Y,T>::type =
boost::detail::sp_empty() )

#else

shared_ptr( shared_ptr<Y> const & r )

#endif

不是拷贝构造函数,是转换构造函数,所以链会是这样的

tmp = shared_ptr<base>(spderived);
b = shared_ptr<base>(tmp);

只有一种方法可以做你想做的事:构造 shared_ptr&lt;base&gt; 类型的临时对象。

g(boost::shared_ptr<base>(spderived));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多