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 );
в этом случае может показаться, что вы указали функцию без возвращаемого типа.
Вы должны определить свой оператор в том же пространстве имен, что и 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...
}
}
}
}