它在标准中被明确禁止,即使某些版本的 VisualStudio 确实允许它。
C++ 标准 7.1.5.3 详细类型说明符,第 2 段
3.4.4 描述了如何在详细类型说明符中对标识符进行名称查找。如果标识符解析为类名或枚举名,则详细类型说明符将其引入声明中,就像简单类型说明符引入其类型名一样。如果标识符解析为 typedef-name 或模板类型参数,则详细说明的类型说明符格式错误。[注意:这意味着,在具有模板类型参数 T 的类模板中,声明 朋友类 T;格式不正确。]
我认为上面的代码是一种密封(禁止扩展)类的模式。还有另一种解决方案,它不会真正阻止扩展,但会标记无意中从类扩展。如ADOBE 源库中所示:
namespace adobe { namespace implementation {
template <class T>
class final
{
protected:
final() {}
};
}}
#define ADOBE_FINAL( X ) private virtual adobe::implementation::final<T>
用法:
class Sealed : ADOBE_FINAL( Sealed )
{//...
};
如果你真的强迫它,它允许扩展:
class SealBreaker : public Sealed, ADOBE_FINAL( Sealed )
{
public:
SealBreaker() : adobe::implementation::final<Sealed>(), Sealed() {}
};
它将限制用户错误地这样做。
编辑:
即将推出的 C++11 标准确实允许您使用稍微不同的语法来处理类型参数:
template <typename T>
class A {
// friend class T; // still incorrect: elaborate type specifier
friend T; // correct: simple specifier, note lack of "class"
};