GameObject
个对象是不可复制的。我想将gameObject
指向的对象移动到std::map<int,GameObject> gameObjects_
而不调用其复制构造函数。此编译器错误地使用此代码,表明我正在尝试复制该对象。我做错了什么?
void GameObjectManager::addObject(int id,GameObject* gameObject){
gameObjects_.insert(std::make_pair(id,std::move(*gameObject)));
}
答案 0 :(得分:2)
您展示的代码符合C ++ 11标准。这是一个完整的演示:
#include <map>
struct GameObject
{
GameObject(GameObject&&) = default;
};
class GameObjectManager
{
std::map<int, GameObject> gameObjects_;
public:
void
addObject(int id,GameObject* gameObject)
{
gameObjects_.insert(std::make_pair(id,std::move(*gameObject)));
}
};
int
main()
{
}
使用tip-of-trunk clang + libc ++进行编译。对不起,我没有VC10解决方法。
更新
添加GameObject(GameObject&amp;&amp;)}修复了问题
啊!如果要移动对象,则必须确保它们具有移动构造函数(并且通常也移动赋值运算符)。
这是关于移动语义的非常简短的教程:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2027.html
它有点陈旧,但它仍然正确地突出了基础知识而没有大量的阅读。
在C ++ 11中,有时会自动为您生成移动构造函数和移动赋值运算符。但是VC10没有实现编译器提供的移动成员,因此您现在不必担心这个方面。
在您的情况下(从NonCopyable
派生),无论如何都不能隐式生成移动成员。所以你必须提供自己的。上面简要教程的链接描述了如何做到这一点,以及实际发生了什么。特别是,研究clone_ptr
示例。
答案 1 :(得分:0)
为什么不std::unqiue_ptr?
typedef std::unique_ptr<GameObject> GameObjectPtr;
typedef std::unordered_map<std::size_t, GameObjectPtr> GameObjectsMap;
然后只引用gameobject_t
。