用C ++来模仿友谊

时间:2012-03-20 11:29:34

标签: c++ templates friend

是否可以将好友类设为模板,例如:

template <class T>
class MyClass {
public:
    friend class T;
};

我努力获得这个的原因是我正在使用policy-based design并且我希望我的策略类能够访问主机成员。 (...现在我开始认为这可能意味着我的设计很糟糕......)

先谢谢你们!

1 个答案:

答案 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)。 - 结束说明]

注释不是规范性的,但它们表明了围绕它的规范的意图。我无法找到使说明正确的特定句子,但我认为至少意图是允许的。