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

时间:2013-06-22 13:57:00

标签: c++ operator-keyword friend scope-resolution

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不会被识别为有效类型。 我怀疑在这种情况下前瞻声明是不够的。有什么工作吗?

2 个答案:

答案 0 :(得分:1)

您应该在定义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...
                }
        }
    }
}

答案 1 :(得分:1)

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

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

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

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

在这种情况下,它会认为您指定的函数没有返回类型。