2013-10-26 3 views
-3

я получаю сообщение об ошибке с помощью следующего кода в VS2013 ...станд :: вектор <станд :: unique_ptr <X>> Проблемы переменного члена вызывает

class Bob 
{ 
private: 
    std::vector<std::unique_ptr<UnrelatedClass>> _aVector; 
    inline Bob(const Bob & other) {}; 
    inline Bob & operator=(const Bob & other) { return *this; }; 
public: 
    Bob(); 
    ~Bob(); 
    Bob(Bob && o); 
}; 

class Fred 
{ 
    friend class Bob; 

    [... A few functions, Bob never used ...] 
}; 

... который отлично компилируется с удалением friend class Bob;. Это ошибка компилятора? Я не уверен, что я делаю неправильно.

Ошибка заключается в следующем:

c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0(615): error C2248: 'std::unique_ptr<Unrelated,std::default_delete<_Ty>>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<Unrelated,std::default_delete<_Ty>>' 
     with 
     [ 
      _Ty=Unrelated 
     ] 
     c:\program files (x86)\microsoft visual studio 12.0\vc\include\memory(1487) : see declaration of 'std::unique_ptr<Unrelated,std::default_delete<_Ty>>::unique_ptr' 
     with 
     [ 
      _Ty=Unrelated 
     ] 
     c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0(614) : while compiling class template member function 'void std::allocator<_Ty>::construct(_Ty *,const _Ty &)' 
     with 
     [ 
      _Ty=std::unique_ptr<Unrelated,std::default_delete<Unrelated>> 
     ] 
     c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0(752) : see reference to function template instantiation 'void std::allocator<_Ty>::construct(_Ty *,const _Ty &)' being compiled 
     with 
     [ 
      _Ty=std::unique_ptr<Unrelated,std::default_delete<Unrelated>> 
     ] 
     c:\program files (x86)\microsoft visual studio 12.0\vc\include\type_traits(580) : see reference to class template instantiation 'std::allocator<_Ty>' being compiled 
     with 
     [ 
      _Ty=std::unique_ptr<Unrelated,std::default_delete<Unrelated>> 
     ] 
     c:\program files (x86)\microsoft visual studio 12.0\vc\include\vector(650) : see reference to class template instantiation 'std::is_empty<_Alloc>' being compiled 
     with 
     [ 
      _Alloc=std::allocator<std::unique_ptr<Unrelated,std::default_delete<Unrelated>>> 
     ] 
     c:\...\include\bob.h(51) : see reference to class template instantiation 'std::vector<std::unique_ptr<Unrelated,std::default_delete<_Ty>>,std::allocator<std::unique_ptr<_Ty,std::default_delete<_Ty>>>>' being compiled 
     with 
     [ 
      _Ty=Unrelated 
     ] 

исследования привели меня, чтобы понять это та же ошибка возникает, когда Bob копируется. Поэтому копирование std::vector, поэтому копирование std::unique_ptr

+1

I гарантируем, что он не «компилирует штраф», так как вы не видите точку с запятой повсюду. Этот код - ложь. –

+0

2 недостающих полуколонии. Исправлена. Вы можете мне помочь? – AStupidNoob

+0

«Я получаю сообщение об ошибке ...» - *** ЧТО ОШИБКА ВЫ ПОЛУЧИТЕ? *** –

ответ

3

Я нашел решение. Кажется, проблема была частично проблема компилятора, в основном моя ошибка. Обновление моего компилятора привело к значительно лучшему сообщению об ошибке, описывающему использование удаленной функции в качестве причины проблемы.

Я проследил проблему вниз к следующей строке:

_aVector.push_back(someUniquePtr); 

который должен был быть:

_aVector.push_back(std::move(someUniquePtr)); 

Я просто должен быть более осторожным в следующий раз;)

Смежные вопросы