2015-04-10 3 views
0

У меня возникла проблема с инициализацией boost::shared_ptr, когда она является переменной-членом класса. Я видел этот предыдущий вопрос:boost shared_ptr инициализируется как член класса

How to initialize a shared_ptr that is a member of a class?

Однако я до сих пор есть ошибка компилятора. Быстрый пример кода:

class A 
{ 
    public: 
     A(); 
}; 

class B 
{ 
    public: 
     B(); 
    private: 
     boost::shared_ptr<A> mA; 

     foo() { 

      // the line below generates a compiler error 
      mA(new A());  // ERROR 

      // below will work.... 
      boost::shared_ptr<A> tmp(new A()); //OK 
      mA = tmp; 

     } 
}; 

Компилятор жалуется: error: no match for call to "(boost::shared_ptr<A>) (A*)"

Однако создание TMP shared_ptr, а затем назначить его mA компилируется нормально. Я использую кросс-компиляцию на машине Ubuntu 14.04 для Intel Edison.

Что мне не хватает?

+2

Используйте список конструктор инициализации - 'Foo(): мА (новый A()) { ...} 'или' foo(): mA (boost :: make_shared ()) {...} ' – Praetorian

+1

Это не имеет ничего общего с' shared_ptr', если 'mA' был' int ', тогда у вас будет такая же проблема, как и попытка« mA (0) »в теле конструктора. Члены уже инициализируются к моменту начала тела конструктора, поэтому вам нужно либо инициализировать их раньше (в списке mem-initializer), либо назначить их в теле. Получите хорошую книгу на C++. –

+0

Я не согласен. Если mA был int, я бы использовал список mem-initializer или установил его в тело конструктора ma = 2 или что-то еще. Это было мое незнание инициализации shared_ptr, что я опубликовал вопрос. – vagrant4ever

ответ

1

Вы ищете mA.reset(new A());

Также общий указатель является частью стандарта в настоящее время, так что вы должны использовать std::shared_ptr

+0

Это позаботилось об этом. Благодарю. переключился на std :: shared_ptr также – vagrant4ever