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不会被识别为有效类型。 我怀疑在这种情况下前瞻声明是不够的。有什么工作吗?
答案 0 :(得分:1)
您应该在定义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...
}
}
}
}
答案 1 :(得分:1)
奇怪的是,你需要这样做:
friend CTribool (::operator !) ( const CTribool& rkTribool );
您需要指定您的函数在全局范围内,但如果没有括号,您的::
将与CTribool绑定,就好像您这样做:
friend (CTribool::operator !) ( const CTribool& rkTribool );
在这种情况下,它会认为您指定的函数没有返回类型。