标准中明确禁止这样做,即使某些版本的 VisualStudio 允许这样做。
C++ 标准 7.1.5.3 详细类型说明符,第 2 段
3.4.4 描述了如何在一个标识符中进行名称查找
详细类型说明符。如果
标识符解析为
类名或枚举名,
详细类型说明符引入了
它进入声明相同
简单类型说明符引入的方式
它的类型名称。如果标识符解析
到 typedef-name 或
模板类型参数,
详细类型说明符是
格式不正确。 [注:这意味着,
在类模板中带有
模板类型参数 T,
宣言朋友T级;是
格式不正确。 ]
我将上面的代码视为密封(禁止扩展)类的模式。还有另一种解决方案,它不会真正阻止扩展,但会标记无意中从类扩展。正如所见ADOBE 源库 http://stlab.adobe.com/group__adobe__final.html:
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() {}
};
它将限制用户错误地执行此操作。
EDIT:
即将推出的 C++11 标准确实允许您使用稍微不同的语法来与类型参数交朋友:
template <typename T>
class A {
// friend class T; // still incorrect: elaborate type specifier
friend T; // correct: simple specifier, note lack of "class"
};