Ошибка C ++ 0x : перегрузка функции с аргументом std :: shared_ptr в аргумент const неоднозначна

Предположим, у меня есть два несвязанных класса A и B . У меня также есть класс Bla , который использует boost :: shared_ptr следующим образом:

class Bla {
public:
    void foo(boost::shared_ptr);
    void foo(boost::shared_ptr);
}

Обратите внимание на const . Это важная часть, которой не хватало в исходной версии этого вопроса. Она компилируется, и следующий код работает:

Bla bla;
boost::shared_ptr a;
bla.foo(a);

Однако, если я переключаюсь с использования boost :: shared_ptr на использование std :: shared_ptr в приведенных выше примерах, я получаю сообщение об ошибке компиляции:

"error: call of overloaded 'foo(std::shared_ptr)' is ambiguous
note: candidates are: void foo(std::shared_ptr)
                      void foo(std::shared_ptr)

Можете ли вы помочь мне понять, почему компилятор не может определить, какую функцию использовать в случае std :: shared_ptr, а может в случае boost :: shared_ptr? Я использую версии GCC и Boost по умолчанию из Ubuntu 11.04 репозиторий пакетов, которые в настоящее время являются GCC 4.5.2 и Boost 1.42.0.

Вот полный код, который вы можете попробовать скомпилировать:

#include 
using boost::shared_ptr;
// #include 
// using std::shared_ptr;

class A {};
class B {};

class Bla {
public:
    void foo(shared_ptr) {}
    void foo(shared_ptr) {}
};

int main() {
    Bla bla;
    shared_ptr a;

    bla.foo(a);

    return 0;
}

Между прочим, эта проблема побудила меня задать этот вопрос о том, нужно ли мне вообще использовать std :: shared_ptr ; -)

6
задан Community 23 May 2017 в 10:34
поделиться