【发布时间】:2011-09-13 10:07:44
【问题描述】:
假设我有两个 不相关 类 A 和 B。我还有一个类Bla 使用boost::shared_ptr,如下所示:
class Bla {
public:
void foo(boost::shared_ptr<const A>);
void foo(boost::shared_ptr<const B>);
}
注意 const。这是这个问题的原始版本缺少的重要部分。这编译,下面的代码工作:
Bla bla;
boost::shared_ptr<A> a;
bla.foo(a);
但是,如果我在上述示例中从使用 boost::shared_ptr 切换到使用 std::shared_ptr,我会收到如下编译错误:
"error: call of overloaded 'foo(std::shared_ptr<A>)' is ambiguous
note: candidates are: void foo(std::shared_ptr<const A>)
void foo(std::shared_ptr<const B>)
你能帮我弄清楚为什么编译器无法确定在 std::shared_ptr 情况下使用哪个函数,而在 boost::shared_ptr 情况下可以吗?我正在使用 Ubuntu 11.04 软件包存储库中的默认 GCC 和 Boost 版本,目前是 GCC 4.5.2 和 Boost 1.42.0。
这是您可以尝试编译的完整代码:
#include <boost/shared_ptr.hpp>
using boost::shared_ptr;
// #include <memory>
// using std::shared_ptr;
class A {};
class B {};
class Bla {
public:
void foo(shared_ptr<const A>) {}
void foo(shared_ptr<const B>) {}
};
int main() {
Bla bla;
shared_ptr<A> a;
bla.foo(a);
return 0;
}
顺便说一句,这个问题促使我向this question 询问我是否应该使用std::shared_ptr ;-)
【问题讨论】:
-
什么编译器(版本)?
-
也许您包含更多代码和#include 路径等?
-
原始问题不正确,因为它在 shared_ptr 的模板类型中缺少“const”。我解决了这个问题并提供了完整的代码示例。
-
您使用的是哪个版本的 Boost?
-
@Lex 我可以重现该问题。但是,在切换到更新的 GCC 时它不存在。也许您可能想测试 gcc-snapshot,或者手动安装 GCC 4.6。
标签: c++ boost stl overloading shared-ptr