c – 好友,运算符关键字和范围解析

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 );

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

点赞