C ++错误:无法使用type值初始化类型的引用

时间:2015-11-18 23:58:30

标签: c++ c++11

嗨,我遇到了一个问题,我无法找到解决办法。我正在创建一个带有智能指针的实体 - 组件系统。

我得到的错误是:

  

std::unique_ptr<PrimaryComponent, std::default_delete<PrimaryComponent>> &类型的引用(非const限定)无法使用std::unique_ptr<PlayerGraphics, std::default_delete<PlayerGraphics>>类型的值初始化

游戏世界级:

auto GameWorld::Setup_World() -> void
{
    player->Attach_Component(player_Graphics);
    Add_GameObject(player);
}

gameobject类附加组件功能:

void GameObject::Attach_Component(std::unique_ptr<PrimaryComponent> &component)
{
    if (component != nullptr)
    {
        component_container.push_back(component);
    }
}

播放器_Graphics和播放器的声明:

class GameWorld
{
private:
    std::vector<std::unique_ptr<GameObject>> gameObject_List;
    std::unique_ptr<GameObject> player;
    std::unique_ptr<PlayerGraphics> player_Graphics

playerGameObjectplayer_Graphics是图形组件,派生自PrimaryComponent

主要组件类:

class PrimaryComponent
{
protected:
public:
    PrimaryComponent();
    virtual ~PrimaryComponent();
    virtual void Render(GameObject &gameObject) = 0;
    virtual void Update(GameObject &gameObject, GameWorld &gameWorld, float gameTime) = 0;
};

PlayerGraphics类:

class PlayerGraphics :
    public GraphicsComponent
{
public:
    PlayerGraphics();
    virtual ~PlayerGraphics();
    virtual void Render(GameObject &gameObject);
    virtual void Update(GameObject &gameObject, GameWorld &gameWorld, float gameTime);
};

PlayerGraphics派生自GraphicsComponent,派生自PrimaryComponent。

2 个答案:

答案 0 :(得分:1)

看起来您使用错误的类型调用GameObject::Attach_Component。它需要一个std::unique_ptr<PrimaryComponent>,但您传递的是std::unique_ptr<PlayerGraphics>

修改

如果PlayerGraphics来自PrimaryComponent,则无关紧要。这不适用于智能指针,只有原始指针。

答案 1 :(得分:1)

问题在于参考:

该行:

namenode_port

应该是:

void GameObject::Attach_Component(std::unique_ptr<PrimaryComponent> &component)

然后,当你打电话给它时,而不是:

void GameObject::Attach_Component(std::unique_ptr<PrimaryComponent> component)

你应该这样做:

player->Attach_Component(player_Graphics);

也就是说,该函数应该取得指针的所有权。请注意,原始player->Attach_Component(std::move(player_Graphics)); 将设置为null(您将其移入,如果您想保留该对象的引用,那么您使用的是错误的工具)。

您可能想知道为什么在您的代码中直接传递player_Graphics有效,但传递std::unique_ptr<PrimaryComponent>却没有。那么解释是你使用的是非const引用,而非const引用只能绑定到同一时间的对象。但是,如果您按值传递参数,那么智能指针将被移动,这一切都将起作用。

这一切都有道理,std::unique_ptr<PlayerGraphics>意味着是不可复制的,不可共享的,可移动的智能指针。您应该移动指针,而不是通过引用传递它。

TL; DR:如果std::unique_ptrB的子类,您可以将A移到std::unique_ptr<B>,但不能将std::unique_ptr<A>绑定到std::unique_ptr<B> std::unique_ptr<a>&类型的引用。

PS。移动和演员的构造函数声明如下:

template <class T, class D = default_delete<T>>
class unique_ptr
{
    template <class U, class E>
    unique_ptr (unique_ptr<U,E>&& x) noexcept;
};