2015-12-13 49 views
0

我试图存储对象的集合(所有从基地acorn::Component继承)。 然而,在我AddComponent功能,我不断收到此错误:TYPE_INFO试图引用删除功能

error C2280: 'type_info::type_info(const type_info &)' : attempting to reference a deleted function

我不知道为什么我收到这个错误,因为我没有在任何我Component类或任何删除功能类存储所有Component对象。

这是给我的问题的功能。它应该Component添加到地图:

 template<typename T> 
     void AddComponent(T* component) 
     { 
#ifdef _DEBUG 
      SDL_Log("acorn::Entity::AddComponent called!"); 
#endif 
      std::pair<std::type_index, acorn::Component*> myPair = std::make_pair(typeid(T), component); 
      mComponentMap.insert(myPair); 
     } 

这里是组件类:

namespace acorn 
{ 
    struct Component 
    { 
    }; 

    struct PositionComponent : public acorn::Component 
    { 
     SDL_Rect positionRect; 
     float x; 
     float y; 
     uint32_t ID; 

     PositionComponent() : x(0.0f), y(0.0f), ID(0) 
     { 

     } 
    }; 

    struct VelocityComponent : public acorn::Component 
    { 
     float xVel; 
     float yVel; 
     uint32_t ID; 

     VelocityComponent() : xVel(0.0f), yVel(0.0f), ID(1) 
     { 

     } 
    }; 

    struct SpriteComponent : public acorn::Component 
    { 
     SDL_Rect spriteRect; 
     SDL_Texture* sprite; 
     uint32_t ID; 

     SpriteComponent() : ID(0) 
     { 
      spriteRect.x = 0; 
      spriteRect.y = 0; 
      spriteRect.h = 32; 
      spriteRect.w = 32; 

      sprite = nullptr; 
     } 
    }; 
} 

我能想到的唯一的事情是,这已经是与结构,但我可以没有发现任何证实这一点的事情。有任何想法吗?

回答

2

make_pair不会与不可复制的类型的工作,因为它创建了一个新的对prvalue。

更换

std::pair<std::type_index, acorn::Component*> myPair = std::make_pair(typeid(T), component); 

std::pair<std::type_index, acorn::Component*> myPair(typeid(T), component); 

,你应该罚款。

+0

不应该自动生成复制和移动构造函数,因为我没有自己定义它们? – Acorn

+1

@Acorn:类型信息类型(表达式typeid(T)')的类型不可复制,因此对拷贝构造函数被删除。 –

+0

[Demo](http://coliru.stacked-crooked.com/a/848478fe24435b40)。 –