C++ 将普通指针强制转换为std::shared_ptr似乎不起作用

C++ 将普通指针强制转换为std::shared_ptr似乎不起作用,c++,pointers,casting,c++11,shared-ptr,C++,Pointers,Casting,C++11,Shared Ptr,这个新调用使用复制构造函数 如果不强制转换,只调用新的内部插入函数,它就不起作用。因此,我使用了共享的ptr铸造来完成它,但是它不起作用。错误: 错误:没有用于调用“dynamic\u pointer\u castsf::Texture*”的匹配函数 这里出了什么问题,我怎样才能让它工作?我对共享PTR是新手,我自己解决不了 谢谢你应该说: #include <SFML/Graphics.hpp> #include <memory> #include <map>

这个新调用使用复制构造函数

如果不强制转换,只调用新的内部插入函数,它就不起作用。因此,我使用了共享的ptr铸造来完成它,但是它不起作用。错误: 错误:没有用于调用“dynamic\u pointer\u castsf::Texture*”的匹配函数

这里出了什么问题,我怎样才能让它工作?我对共享PTR是新手,我自己解决不了

谢谢你应该说:

#include <SFML/Graphics.hpp>
#include <memory>
#include <map>

int main(int argc, char **argv)
{
std::map <const std::string, std::shared_ptr<sf::Texture> > resources;
sf::Texture tempResource;
tempResource.loadFromFile("1.PNG");

resources.insert(std::pair<const std::string, std::shared_ptr<sf::Texture>>("1", std::dynamic_pointer_cast<sf::Texture>( new sf::Texture(tempResource) ) ) );

return 0;
}
但这还不如“共享”好,因为“共享”更有效,而且永远不使用新的东西也违反了“好品味”的规则。无论哪种方式,安放点都是它允许显式构造函数,与插入不同

甚至更好的是,根本不使用临时文件:

resources.emplace("1", new sf::Texture(tempResource));

您要做的是从以前的非托管内存创建一个共享\u ptr。动态\u指针\u投射不是作业的工具。相反,这应该起作用:

resources.emplace("1", std::make_shared<sf::Texture>()).second->loadFromFile("1.PNG");

谢谢这似乎是最好的办法,但是。。。g++将从4.8开始支持emplace。。。无聊的。。。好的,我现在将以插入方式进行操作,并在4.8发布后发表评论将其更新为emplace。@user1873947:当然,但无论如何都要放弃临时设置,使用最终解决方案,您可以使用插入方式进行类似操作。当然,但我需要在resManager::add函数中进行修改,所以我需要做一个设计,它不会创建相同事物的两个实例。但是,它应该相当简单。我的意思是我想要一种更简单的方法来调用add函数,而不必键入std::make_shared.second->loadFromFile1.PNG asargument@user1873947字体你的手指懒惰无关紧要。MaxySoad比新的更高效,你应该更喜欢。@ USS18739 47:如果它解决了你的问题,你可能会考虑接受Kerrek或我的答案来表明问题已经解决。当然,投票回答也是表达感激的好方法;我不能投票,因为我的支持率低。。。两个答案都很好,但我会选择你的,因为你的代表性较低。
resources.emplace("1", new sf::Texture(tempResource));
resources.emplace("1", std::make_shared<sf::Texture>()).second->loadFromFile("1.PNG");
resources.insert(std::pair<const std::string, std::shared_ptr<sf::Texture>>("1", std::shared_ptr<sf::Texture>(new sf::Texture(tempResource)));
//or:
resources.insert(std::make_pair("1", std::shared_ptr<sf::Texture>(new sf::Texture(tempResource)));
auto tempResource = std::make_shared<sf::Texture>();
tempResource->loadFromFile("1.PNG");
resources.emplace("1",std::move(tempResource));//or insert if emplace isn't availible