是否可以将好友类设为模板,例如:
template <class T>
class MyClass {
public:
friend class T;
};
我努力获得这个的原因是我正在使用policy-based design并且我希望我的策略类能够访问主机成员。 (...现在我开始认为这可能意味着我的设计很糟糕......)
先谢谢你们!
答案 0 :(得分:4)
在C ++ 03中,不允许向模板的参数声明友谊。
§7.1.5.3/ 2
[...]如果标识符解析为typedef- name或模板类型参数,则elaborated-type-specifier格式不正确。 [注意:这意味着,在具有模板类型参数T的类模板中,声明
friend class T;
是不正确的。 ]
在C ++ 11中,这方面有一些变化,但有点奇怪。 friend class T;
仍然不正常,但允许friend T
。报价可以在同一段中找到:
§7.1.5.3/ 2
[...] [注意:这意味着,在具有模板类型参数T的类模板中,声明
friend class T;
是不正确的。但是,类似声明的朋友T;是允许的(11.3)。 - 结束说明]
注释不是规范性的,但它们表明了围绕它的规范的意图。我无法找到使说明正确的特定句子,但我认为至少意图是允许的。