在dll

时间:2018-05-16 14:43:56

标签: c++ templates dll entity-component-system

我正在尝试将我的游戏引擎用于外部项目。一切正常但我在尝试创建自定义组件时遇到问题(继承自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:

PlayerController.h

#pragma once

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

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

    void Update();
};

之后我将自定义组件添加到我的“Player”GameObject:

Main.cpp的

#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方法中“已知/可用”?

0 个答案:

没有答案