簡體   English   中英

好友,運算符關鍵字和范圍解析

[英]Friends, operator keyword and 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識別為有效類型。 我懷疑在這種情況下,向前聲明還不夠。 有什么解決方法嗎?

您應該在與定義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...
                }
        }
    }
}

奇怪的是,您需要執行以下操作:

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

您需要指定您的函數在全局范圍內,但是如果沒有括號,您的::將與CTribool綁定,就像您這樣做:

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

在這種情況下,它會認為您正在指定沒有返回類型的函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM