【问题标题】:Global friend function unable to access private scope even though declared global即使声明为全局,全局友元函数也无法访问私有范围
【发布时间】:2012-06-09 20:42:10
【问题描述】:

我确信这是我忽略的非常容易的事情,但我正在为这个错误消息而烦恼。我很少使用朋友功能。

error: 'LRESULT Window_Proc(HWND, UINT, WPARAM, LPARAM)' should have been declared inside '::'

这是我的定义:

namespace rayc 
{
    class win32_window: public window {
    public:
        win32_window();
        ~win32_window();

        void show();
        void hide();
        void pump_message();

    private:
        friend LRESULT CALLBACK ::Window_Proc(HWND, UINT, WPARAM, LPARAM);

        void set_closed(bool);

        HWND hWin;
    };
}

这个错误信息我不太明白,它被定义为属于全局范围,不是吗?!

使用 MinGW-64 TDM 编译。

【问题讨论】:

    标签: c++ class function


    【解决方案1】:

    这个错误信息我不太明白,它被定义为属于全局范围,不是吗?!

    不是,除非您在 friend 声明之前在全局 命名空间 中包含前向声明。如果friend 声明引入了一个新符号,则该符号位于包含它的 的封闭命名空间

    尝试添加

    LRESULT CALLBACK Window_Proc(HWND, UINT, WPARAM, LPARAM);
    

    在全局命名空间中,在声明您的之前。

    【讨论】:

    • 啊……这就解释了。我删除了 :: 并将其作为 fwd-decl 放在封闭的命名空间中,无论如何更好。立即编译,谢谢。
    • @Skurmedel:你不需要删除全局命名空间限定符::,事实上只要你转发声明函数就可以保留它。
    • 我认为无论如何它都可以存在于命名空间中,这就是我把它拿走的原因。是否有充分的理由将函数保持在全局范围内?
    • @Skurmedel:不,没有理由让函数保持全局。最好将其保留在命名空间级别,但不需要前向声明它。
    • @Skurmedel:请注意,如果您删除 ::,朋友声明将befried ::rayc::Window_Proc 而不是 ::Window_Proc
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 2020-01-15
    • 2021-02-23
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多