0

我正在尝试将我的游戏引擎用于外部项目。一切正常,但是当我尝试创建自定义组件时遇到问题(继承自 ABhaviour,ABhaviour 是一个抽象类,表示可以激活/禁用的组件)。

GameObject.h (使用 __declspec(dllexport) 导出)

// [...]

template <typename Class, typename ... Args>
std::shared_ptr<Class> GameObject::AddComponent(Args... args)
{
    auto newComp = std::make_shared<Class>(std::forward<Args>(args)...);
    m_components[typeid(*newComp).hash_code()] = newComp;
    m_components[typeid(*newComp).hash_code()]->SetOwner(*this);
    return newComp;
}

// [...]

在另一个项目(使用我的游戏引擎)中,我正在尝试创建自定义 ABehaviour :

玩家控制器.h

#pragma once

#include <ElkGameEngine/Objects/Components/Behaviours/ABehaviour.h>

class PlayerController :ElkGameEngine::Objects::Components::Behaviours::ABehaviour
{
    PlayerController() = default;
    ~PlayerController() = default;

    void Update();
};

之后,我将自定义组件添加到我的“玩家”游戏对象中:

主文件

#include <ElkGameEngine/ElkGameEngine.h>
#include <ElkGameEngine/Objects/AObject.h>
#include <ElkGameEngine/Objects/Components/AComponent.h>

#include "PlayerController.h"

using namespace ElkGameEngine::Objects::Components;
using namespace ElkGameEngine::Objects::Components::Behaviours;

int main()
{
    ElkGameEngine::Managers::EngineManager elkGameEngine;
    elkGameEngine.GetSceneManager()->CreateScene("ElkCraft");

    auto& player = elkGameEngine.GetSceneManager()->CreateEmptyGameObject("Player");
    player.AddComponent<PlayerController>(); /* Here is the problem */

    while (elkGameEngine.IsRunning())
    {
        elkGameEngine.PreUpdate();


        elkGameEngine.PostUpdate();
    }

    return EXIT_SUCCESS;
}

Visual Studio 很不高兴,给我打印这个:

Severity    Code    Description Project File    Line    Suppression State
Error   C2440   '<function-style-cast>': cannot convert from 'const std::shared_ptr<PlayerController>' to 'std::shared_ptr<ElkGameEngine::Objects::Components::AComponent>' ElkCraft    c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.12.25827\include\memory  1472    
Error   C2228   left of '.swap' must have class/struct/union    ElkCraft    c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.12.25827\include\memory  1472    

输出窗口:

1>------ Build started: Project: ElkCraft, Configuration: Debug x64 ------
1>Could Not Find C:\Users\adrie\Desktop\GROUP_2\PFA\ElkCraft\*.dll
1>main.cpp
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.12.25827\include\memory(1472): error C2440: '<function-style-cast>': cannot convert from 'const std::shared_ptr<PlayerController>' to 'std::shared_ptr<ElkGameEngine::Objects::Components::AComponent>'
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.12.25827\include\memory(1472): note: No constructor could take the source type, or constructor overload resolution was ambiguous
1>c:\users\adrie\desktop\group_2\pfa\elkengine\build\elkgameengine\include\elkgameengine\objects\gameobject.h(53): note: see reference to function template instantiation 'std::shared_ptr<ElkGameEngine::Objects::Components::AComponent> &std::shared_ptr<ElkGameEngine::Objects::Components::AComponent>::operator =<PlayerController>(const std::shared_ptr<PlayerController> &) noexcept' being compiled
1>c:\users\adrie\desktop\group_2\pfa\elkengine\build\elkgameengine\include\elkgameengine\objects\gameobject.h(55): note: see reference to function template instantiation 'std::shared_ptr<ElkGameEngine::Objects::Components::AComponent> &std::shared_ptr<ElkGameEngine::Objects::Components::AComponent>::operator =<PlayerController>(const std::shared_ptr<PlayerController> &) noexcept' being compiled
1>c:\users\adrie\desktop\group_2\pfa\elkcraft\sources\main.cpp(18): note: see reference to function template instantiation 'std::shared_ptr<PlayerController> ElkGameEngine::Objects::GameObject::AddComponent<PlayerController,>(void)' being compiled
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.12.25827\include\memory(1472): error C2228: left of '.swap' must have class/struct/union
1>Generating Code...
1>Compiling...
1>PlayerController.cpp
1>Generating Code...
1>Done building project "ElkCraft.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

我认为问题出在我的游戏引擎(这是一组 DLL)正在导出模板化方法(AddComponent 和其他方法,如 GetComponent)。

  • 是否可以使用 dll 中的模板化方法和项目中的类/结构模板参数使用 dll ?
  • 难道我做错了什么 ?
  • 我是否需要在我的 PlayerController 上指定某些内容以使其在 AddComponent 方法中“已知/可用”?
4

0 回答 0