Друзья, ключевое слово оператора и разрешение области

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 не распознается как допустимый тип. Я подозреваю, что в этом случае предварительной декларации недостаточно. Любая работа вокруг?

2 ответа

Решение

Как ни странно, вам нужно сделать это:

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

Вы должны указать, что ваша функция находится в глобальной области видимости, но без скобок ваш :: будет связываться с CTribool, как если бы вы делали это:

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

в этом случае может показаться, что вы указали функцию без возвращаемого типа.

Вы должны определить свой оператор в том же пространстве имен, что и 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...
                }
        }
    }
}
Другие вопросы по тегам