我仍在探索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;
}
有人可以解释为什么我不能将自动指针转换为弱指针吗?
答案 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
。