我正在努力将代码库从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则另有说明。
我有点失落,所以任何帮助都会很棒!
答案 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也涵盖了这一点。