2015-09-05 46 views
0

我仍在探索C++ 11.所以我很确定我做错了什么。但我无法弄清楚问题所在。将auto_ptr分配给weak_ptr

我有以下代码:

MyClass::MyClass(const PlayerEventListener* eventListener) 
{ 
    weak_ptr<PlayerEventListener> _listener; 
    std::auto_ptr<PlayerEventListener> autoPtr; 
    autoPtr.reset(const_cast<PlayerEventListener*> (eventListener)); 
    // I get error for this line 
    _listener = autoPtr; 
} 

我得到以下错误:没有可行的重载 '='

但下面的代码编译罚款:

MyClass::MyClass(const PlayerEventListener* eventListener) 
{ 
    weak_ptr<PlayerEventListener> _listener; 
    std::shared_ptr<PlayerEventListener> sharedPtr; 
    sharedPtr.reset(const_cast<PlayerEventListener*> (eventListener)); 
    // I get error for this line 
    _listener = sharedPtr; 
} 

有人可以解释为什么我无法将自动指针转换为弱指针?

+1

'auto_ptr'没有引用计数器,一个'weak_ptr'会被观察到 –

+1

在std :: auto_ptr在C++ 11中被弃用,基本上是一个'std :: unique_ptr',你不能复制一个unique_ptr。 –

+1

“我很确定我做错了什么” - 是的,您正在使用'auto_ptr' –

回答

0

weak_ptr是一个对象,它保存对shared_ptr而不是auto_ptr实际保存的对象的安全引用。因此,没有任何超载的operator=可以在weak_ptr的实现中提供分配auto_ptrweak_ptr。它可以通过编译this example code,看着错误

In constructor 'MyClass::MyClass(const PlayerEventListener*)': 
21:14: error: no match for 'operator=' (operand types are 'std::weak_ptr<PlayerEventListener>' and 'std::auto_ptr<PlayerEventListener>') 

验证只需记住:根据http://www.cplusplus.com/reference/memory/auto_ptr/

This class template (auto_ptr) is deprecated as of C++11. unique_ptr is a new facility with a similar functionality, but with improved security (no fake copy assignments), added features (deleters) and support for arrays. See unique_ptr for additional information.

+1

不赞成使用'std :: auto_ptr',但并不回答这个问题! –

+0

@πάνταῥεῖ更新回答问题。 – PiotrSliwa