Предположим, у меня есть два несвязанных класса 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?Я использую стандартные версии GCC и Boost из репозитория пакетов Ubuntu 11.04, которые в настоящее время являются 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;
}
Кстати, эта проблема побудила меня задать этот вопрос о том, должен ли я вообще пока использовать std::shared_ptr
; -)