朋友,操作符关键字和范围解析

Friends, operator keyword and scope resolution

本文关键字:范围 关键字 操作符 朋友      更新时间:2023-10-16
namespace GameForge
{
    namespace Core
    {
        class CTribool;
    }
}
GameForge::Core::CTribool operator ! ( const GameForge::Core::CTribool& rkTribool );
namespace GameForge
{
    namespace Core
    {
        class CTribool
        {
            friend CTribool operator ! ( const CTribool& rkTribool );
        private:
            EState m_eState;
        };
    }
}

GameForge::Core::CTribool operator ! ( const GameForge::Core::CTribool& rkTribool )
{
    switch( rkTribool.m_eState )
        {
    // Some stuff...

不编译,因为m_eState在最后一个定义中不可访问。原因是友元声明发生在CTribool名称空间中,因此声明了一个不同的函数。因此,我尝试使用范围解析操作符,如下所示:

friend CTribool ::operator ! ( const CTribool& rkTribool );

friend CTribool ::( operator ! ) ( const CTribool& rkTribool );

但这也不起作用,因为不知何故CTribool不被识别为有效类型。我怀疑在这种情况下,向前声明是不够的。

奇怪的是,您需要这样做:

        friend CTribool (::operator !) ( const CTribool& rkTribool );

你需要指定你的函数是在全局范围内,但没有括号,你的::将绑定CTribool,就像你这样做:

        friend (CTribool::operator !) ( const CTribool& rkTribool );

在这种情况下,它会认为你指定了一个没有返回类型的函数

您应该在定义CTribool类的名称空间中定义您的操作符。这是正确的做法;ADL将在应用过程中发现:

namespace GameForge
{
    namespace Core
    {
        class CTribool
        {
            friend CTribool operator ! ( const CTribool& rkTribool );
        private:
            EState m_eState;
        };
    }
}

namespace GameForge
{
    namespace Core
    {
        CTribool operator ! ( const GameForge::Core::CTribool& rkTribool )
        {
            switch( rkTribool.m_eState )
                {
                // Some stuff...
                }
        }
    }
}