为什么我不能成为模板参数的朋友?

时间:2009-06-17 13:32:57

标签: c++ templates friend

在研究问题的答案时(基于this answer),我尝试执行以下操作:

template <class T>
class friendly {
    friend class T;
};

friendly<string> howdy;

无法使用以下错误进行编译:

  

错误:模板参数“T”不能用于             精心设计的类型说明符             朋友班T;

从我的好朋友Google可以理解的是,我不会不小心尝试实例化friendly<int>,但为什么在编译模板时这是一个错误?在使用无效类型实例化模板时不应该是错误(例如我写的int f() { return T::foo(); }

2 个答案:

答案 0 :(得分:3)

该标准的7.1.5.3节明确地将此描述为一个错误的详细类型说明符的例子。

可以找到关于该主题的讨论here

答案 1 :(得分:2)

更多googleling为(PDF)提出扩展friend声明 C++0x

本文件包含以下内容:

template <typename T> class R {
    friend T;
};
R<C> rc; // class C is a friend of R<C>
R<int> ri; // OK: “friend int;” is ignored

这比我的想法更进一步(忽略非法friend减速而不是在实例化期间失败)。所以我想答案是没有充分的理由而且它正在被纠正。