C++ 好友、运算符关键字和范围解析

C++ 好友、运算符关键字和范围解析,c++,operator-keyword,friend,scope-resolution,C++,Operator Keyword,Friend,Scope Resolution,未编译,因为在上一个定义中无法访问m_eState。原因是友元声明发生在CTribool命名空间中,因此声明了一个不同的函数。所以我尝试使用范围解析操作符,如下所示 namespace GameForge { namespace Core { class CTribool; } } GameForge::Core::CTribool operator ! ( const GameForge::Core::CTribool& rkTribool )

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

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...

但这也不起作用,因为CTribool无法被识别为有效类型。
我怀疑在这种情况下,远期申报是不够的。任何解决方法?

您应该在定义
CTribool
类的名称空间中定义运算符。这是正确的做法;申请时可通过以下方式找到:


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

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...
                }
        }
    }
}
您需要指定您的函数在全局范围内,但如果没有括号,您的
将与CTribool绑定,就像您正在执行以下操作一样:

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

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

并不是说
CTribool
不被识别为有效类型。当您在
朋友
声明中使用限定名时,必须引用已声明的内容。有什么方法可以实现我要做的吗?我的意思是存在某种循环依赖关系(CTribool操作符->CTribool->与操作符的友谊)。不要将
C
用作类的前缀,它从来都不合适,完全是基于对MFC命名约定的误解。
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...
                }
        }
    }
}
        friend CTribool (::operator !) ( const CTribool& rkTribool );
        friend (CTribool::operator !) ( const CTribool& rkTribool );