将auto_ptr分配给weak_ptr

时间:2015-09-05 19:52:24

标签: c++ c++11 gcc clang

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

我有以下代码:

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;
}

我收到以下错误:没有可行的超载&#39; =&#39;

但是下面的代码编译得很好:

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 个答案:

答案 0 :(得分:0)

weak_ptr是一个对象,它保存对shared_ptr实际持有的对象的安全引用,而不是auto_ptr。因此,没有任何重载operator=可以在auto_ptr的实施中为weak_ptr分配weak_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/

  

从C ++ 11开始,不推荐使用此类模板(auto_ptr)。 unique_ptr是新的   具有类似功能但具有更高安全性的设施(没有   虚假副本分配),添加功能(删除)和支持   阵列。有关其他信息,请参阅unique_ptr

相关问题