C++ 好友、运算符关键字和范围解析
未编译,因为在上一个定义中无法访问m_eState。原因是友元声明发生在CTribool命名空间中,因此声明了一个不同的函数。所以我尝试使用范围解析操作符,如下所示C++ 好友、运算符关键字和范围解析,c++,operator-keyword,friend,scope-resolution,C++,Operator Keyword,Friend,Scope Resolution,未编译,因为在上一个定义中无法访问m_eState。原因是友元声明发生在CTribool命名空间中,因此声明了一个不同的函数。所以我尝试使用范围解析操作符,如下所示 namespace GameForge { namespace Core { class CTribool; } } GameForge::Core::CTribool operator ! ( const GameForge::Core::CTribool& rkTribool )
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...
及
但这也不起作用,因为CTribool无法被识别为有效类型。
我怀疑在这种情况下,远期申报是不够的。任何解决方法?您应该在定义
CTribool
类的名称空间中定义运算符。这是正确的做法;申请时可通过以下方式找到:
奇怪的是,你需要这样做:
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...
}
}
}
}
您需要指定您的函数在全局范围内,但如果没有括号,您的:
将与CTribool绑定,就像您正在执行以下操作一样:
friend CTribool (::operator !) ( const CTribool& rkTribool );
在这种情况下,它会认为您指定的函数没有返回类型。并不是说
CTribool
不被识别为有效类型。当您在朋友
声明中使用限定名时,必须引用已声明的内容。有什么方法可以实现我要做的吗?我的意思是存在某种循环依赖关系(CTribool操作符->CTribool->与操作符的友谊)。不要将C
用作类的前缀,它从来都不合适,完全是基于对MFC命名约定的误解。
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 );
friend (CTribool::operator !) ( const CTribool& rkTribool );