C ++ auto_ptr和shared_ptr从VC ++ 10更改为VC ++ 12

时间:2014-06-12 13:50:58

标签: c++ visual-studio visual-c++ visual-studio-2012 visual-c++-2010

我正在努力将代码库从Visual Studio和C ++ 10更新到VS / C ++ 12

我遇到了与shared_ptr和auto_ptr有关的问题。

原始C ++ 10中的代码是

void CommandLoader::RegisterCommand(std::auto_ptr<ILoadableCommand> cmd)
{
assert(cmd.get() != NULL);
m_pImpl->m_registered.push_back(shared_ptr<ILoadableCommand>(cmd));
}

编译错误是:

error C2440: '<function-style-cast>' : cannot convert from std::auto_ptr<ILoadableCommand>' to 'std::shared_ptr<ILoadableCommand>'

在编辑内部,它抱怨

Error: no instance of constructor"std::shared_ptr<_Ty> matches the argument list.

我的猜测是auto_ptr不再被接受为shared_ptr构造函数的参数,但http://msdn.microsoft.com/en-us/library/bb981959.aspx则另有说明。

我有点失落,所以任何帮助都会很棒!

1 个答案:

答案 0 :(得分:1)

简而言之:不要使用auto_ptr。它基本上已经坏了。请改用std :: unique_ptr。

你使用auto_ptr的方式也很奇怪:

void CommandLoader::RegisterCommand(std::auto_ptr<ILoadableCommand> cmd)

这意味着每次调用此函数时,它都会生成一个新的auto_ptr,它取得缓冲区的所有权。然后,您将其归属于shared_ptr。

这听起来像你应该真正给函数一个原始指针,或至少引用一个参考:

void CommandLoader::RegisterCommand(std::unique_ptr<ILoadableCommand>& cmd)

MSDN Magazine article也涵盖了这一点。