4
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 未被识别为有效类型。我怀疑在这种情况下前向声明是不够的。有什么解决办法吗?

4

2 回答 2

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...
                }
        }
    }
}
于 2013-06-22T14:12:07.007 回答
1

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

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

您需要指定您的函数在全局范围内,但如果没有括号,您::将与 CTribool 绑定,就像您正在执行此操作一样:

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

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

于 2013-06-22T14:12:43.073 回答