gpt4 book ai didi

c++ - 无法在派生类的子命名空间中实现方法

转载 作者:行者123 更新时间:2023-12-04 16:55:22 25 4
gpt4 key购买 nike

具有嵌入式 C 经验的 Dotnet dev 在这里进入 cpp 领域,让您了解我的经验/知识。
我有一个基类 Windowsrc/Core/Window/ :

namespace Pyrite::Core::Window
{
class PYR_API Window
{
public:
using EventCallbackFn = std::function<void(Pyrite::Event&)>;

virtual ~Window();
virtual void OnUpdate();

virtual uint32_t GetWidth() const = 0;
virtual uint32_t GetHeight() const = 0;

virtual void SetEventCallback(const EventCallbackFn& callback) = 0;
virtual void SetVSync(bool isEnabled) = 0;
virtual bool IsVSyncEnabled() const = 0;

static Window* Create(const WindowProperties& props = WindowProperties());
};
}
由此,我为特定于平台的 WindowsWindow 创建了一个派生类。 , 我想把它存储在 src/Core/Window/Platform/ :
namespace Pyrite::Core::Window::Platform
{
class WindowsWindow : public Pyrite::Core::Window::Window
{
public:
WindowsWindow(const WindowProperties& properties);
virtual ~WindowsWindow();

void OnUpdate() override;

inline uint32_t GetWidth() const override { return m_Data.Width; }
inline uint32_t GetHeight() const override { return m_Data.Height; }

inline void SetEventCallback(const EventCallbackFn& callback) override { m_Data.EventCallback = callback; }
void SetVSync(bool isEnabled) override { m_Data.VSyncEnabled = isEnabled; }
bool IsVSyncEnabled() override {return m_Data.VSyncEnabled; }
private:

virtual void Init(const WindowProperties& properties);
virtual void Close();

GLFWwindow* m_Window;

struct WindowData
{
std::string Title;
uint32_t Width, Height;
bool VSyncEnabled;

EventCallbackFn EventCallback;
};

WindowData m_Data;

};
}
然而,在 WindowsWindow.cpp ,当我尝试为 Window::Create() 创建实现时我收到一个关于无法在这里定义它的错误:
namespace Pyrite::Core::Window::Platform
{
static bool s_GLFWInitialised = false;

Window* Window::Create(const WindowProperties& properties)
{
return new WindowsWindow(properties);
}
}
'Pyrite::Core::Window::Window *Pyrite::Core::Window::Window::Create(const Pyrite::Core::Window::WindowProperties &)': symbol cannot be defined within namespace 'Platform'  PyriteEngine    C:\repos\Pyrite\PyriteEngine\src\Core\Window\Platform\WIndowsWindow.cpp 9   
当我调整命名空间时,它们都位于 Pyrite::Core::Window它似乎消失了......但是,我无法在子命名空间中定义它对我来说似乎很奇怪。如果可能,我希望我的命名空间遵循我的文件夹结构(因为这几乎是我习惯的并且它保持逻辑和整洁)并且将平台特定的东西隐藏在子命名空间中似乎对我有意义。
这只是我无法做到的事情还是我在这里遗漏了什么?

最佳答案

首先,C++ 中源文件和命名空间之间的分离是一个特性,因为它们可以在适当的情况下遵循相同的结构,但其他组织也是可能的。除此之外,它是 不可能 做(字面意思)你问的事情,因为它会产生奇怪的 “ sibling ”对于被认为比其值(value)更麻烦的名称查找。特别是,给定

namespace A {
int i;
struct X {void f(); void g(); void h();};
namespace B {
void g();
namespace C {
int i;
void h();
void X::f() {g(); h(); ++i;} // pretend this is OK
}
}
}
不完全清楚是否 B::g和/或 C::h更接近于 X::f 的定义比 X::gX::h .也不清楚是否需要搬家 X::f的定义进或出类的变化 i被发现。
您通常可以使用 using 声明来解决这些限制: X以上可能在 B 中定义但随后 暴露 A (或在 C 中!)。有时,受影响的成员函数也可以移动到 中。底座 属于不同命名空间的类。

关于c++ - 无法在派生类的子命名空间中实现方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69170019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com