调用继承类函数的未解析外部符号 [duplicate]

Unresolved External Symbol calling inherited class function [duplicate]

提问人:Falcon Oscuro 提问时间:3/6/2020 最后编辑:Falcon Oscuro 更新时间:3/6/2020 访问量:696

问:

我正在尝试让一个类从继承的类调用一个函数,但是每当我这样做时,我都会收到一个未解决的外部错误。我对为什么会发生这种情况感到困惑,因为所有文件似乎都已正确包含,我没有重写该函数并且Visual Studio在编译之前没有抱怨它。LNK2019

我试过:

  • 运行用实际代码替换函数调用,这修复了两个错误之一,但我仍然得到一个未解决的外部问题,因为有问题的函数正在从另一个类调用另一个函数。

  • 弄乱命名空间,因为继承的类位于单独的命名空间下,我认为这就是问题所在,例如.Memory::Allocate(...)

  • 直接调用类函数,所以我尝试了Allocate(...)Memory::GlobalMemoryUser::Allocate(...)

  • 使用this->...

来自 GlobalMemoryUser.h 的相关代码

#include "MemoryManager"

namespace Memory
{
    namespace Internal
    {
        extern MemoryManager* GlobalMemoryManager;
    {

    class GlobalMemoryUser
    {
    public:

        // Allocator and deallocator
        inline const void* Allocate(size_t, const char* user);
        inline const void DeAllocate(void*);

    private:

        // A pointer to the global memory manager
        Internal::MemoryManager* GlobalMemoryManager;
    };
}

来自 GlobalMemoryManager.cpp 的相关代码

#include "GlobalMemoryUser.h"

namespace Memory {

    const void* GlobalMemoryUser::Allocate(size_t size, const char* user)
    {
        return GlobalMemoryManager->Allocate(size, user);
    }

    const void GlobalMemoryUser::DeAllocate(void* p)
    {
        GlobalMemoryManager->DeAllocate(p);
    }
}

System Manager.h 中的相关代码

#include "GlobalMemoryUser.h"

namespace ECS
{
    class SystemManager : public Memory::GlobalMemoryUser
    {
        // Constructor and Deconstructor
        SystemManager();
        ~SystemManager();
    };
}

来自系统管理器的相关代码.cpp

#include "SystemManager.h"

namespace ECS
{
    SystemManager::SystemManager()
    {
        systemAllocator = new Memory::LinearAllocator(ECS_SYSTEM_MEMORYBUFFERSIZE, Allocate(ECS_SYSTEM_MEMORYBUFFERSIZE, "SystemManager"));
    }


    SystemManager::~SystemManager()
    {
        for (std::vector<ISystem*>::reverse_iterator it = systemWorkOrder.rbegin(); it != systemWorkOrder.rend(); it++)
        {
            (*it)->~ISystem();
            *it = nullptr;
        }

        systemWorkOrder.clear();
        systemsTable.clear();

        DeAllocate((void*)systemAllocator->GetUsedMemoryStart());
        delete systemAllocator;
        systemAllocator = nullptr;
    }
}

当尝试从 GlobalMemoryUser 父类调用分配器和解除分配器时,系统管理器的构造函数和解构函数中会发生相关错误。

确切的错误消息:LNK2019 unresolved external symbol "public: void const * __cdecl Memory::GlobalMemoryUser::Allocate(unsigned __int64,char const *)" (?Allocate@GlobalMemoryUser@Memory@@QEAAPEBX_KPEBD@Z) referenced in function "public: __cdecl ECS::SystemManager::SystemManager(void)" (??0SystemManager@ECS@@QEAA@XZ)

C++ C++11 继承 未解析外部

评论

0赞 vahancho 3/6/2020
错误消息到底是什么?
0赞 Alan Birtles 3/6/2020
请将错误消息编辑到您的问题中
0赞 Alan Birtles 3/6/2020
这是你的确切代码吗?由于大括号不匹配,它似乎无法编译
0赞 vahancho 3/6/2020
是否属于同一模块?SystemManagerGlobalMemoryUser
1赞 walnut 3/6/2020
删除关键字。它们不属于那里,因为它们需要在标头中定义函数。请参阅链接的重复项。inline

答: 暂无答案