【发布时间】: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