【问题标题】:Friends, operator keyword and scope resolution朋友、运算符关键字和范围解析
【发布时间】:2013-06-19 13:05:45
【问题描述】:
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 未被识别为有效类型。 我怀疑在这种情况下前向声明是不够的。有什么解决办法吗?

【问题讨论】:

  • 不是CTribool不被识别为有效类型。当您在 friend 声明中使用限定名称时,您必须引用已声明的内容。
  • 有什么方法可以实现我想要做的吗?我的意思是存在某种循环依赖(CTribool 运营商 -> CTribool -> 与运营商的友谊)。
  • 不要使用 C 作为类的前缀,它从来都不合适,纯粹是基于对 MFC 命名约定的误解。

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


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-04-20
      • 1970-01-01
      • 2013-06-13
      • 2011-07-28
      • 2010-09-09
      • 2014-10-05
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多