6

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

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

friendly<string> howdy;

这无法编译并出现以下错误:

错误:模板参数“T”不能在详细类型说明符朋友类 T 中使用;

从我的好朋友谷歌那里可以了解到,这样我就不会意外地尝试实例化friendly<int>,但为什么在编译模板时会出现错误?用无效类型实例化模板时不应该是错误吗(比如我写的int f() { return T::foo(); }

4

2 回答 2

3

该标准的第 7.1.5.3 节明确地将其描述为一个格式错误的详细类型说明符的示例。

可以在此处找到有关该主题的讨论。

于 2009-06-17T13:46:32.043 回答
2

更多的 googleling 带来了C ++0x的扩展friend声明 (PDF)

本文档包含以下内容:

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减速而不是在实例化过程中失败)。所以我想答案是没有充分的理由,并且正在纠正中。

于 2009-06-18T12:33:15.033 回答