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
, вы должны ссылаться на то, что уже объявлено. - person Angew is no longer proud of SO   schedule 22.06.2013C
в качестве префикса для классов, это никогда не было уместно и было основано исключительно на непонимании соглашений об именах MFC. - person Konrad Rudolph   schedule 22.06.2013