![]() |
1
7
…如果我更改了运算符的前向声明,使其不匹配 friend函数应该被视为一种非常特殊的声明类型。本质上,编译器足够分析声明,但是除非您真正专门化了类,否则不会进行语义检查。
在进行建议的修改之后,如果您随后实例化
然而……删除转发声明会导致问题
编译器试图解析声明来存储它,直到类模板被专门化。在分析过程中,编译器到达
唯一的方法就是
删除转发声明时,找不到模板,并且
…删除转发声明并使用上面代码中的替代友元声明时。请注意,模板参数u没有出现在以下签名中… 不要求在函数模板的参数中使用所有模板参数。另一种声明用于新的函数模板,只有在命名空间中声明并指定显式模板参数时,才能调用该模板。 一个简单的例子是:
…此代码是否正确?… 好吧,这有两个部分。第一个问题是,替代friend函数在后面的作用域中不引用声明:
对于每个专门化,friend函数实际上将在命名空间中声明:
每一个专业
根据前一个问题的答案,您可以使用以下建议的转发声明: litb ,或者您按照 Dr_Asik's 回答(我可能会这么做)。 更新:第二条评论 …在类之前更改前向声明;类中的声明仍然与我稍后实现的函数匹配…
正如我上面指出的,编译器检查
它通过查找名称并检查它是否是模板来实现这一点。只要您有一个虚拟的转发声明,那么这个“技巧”编译器将您的朋友视为模板名,因此
稍后,当您实例化类时,您确实有一个有效的模板来匹配。本质上,您只是在欺骗编译器,让它将朋友视为模板专门化。 您可以在这里这样做,因为(如我前面所说),此时不会进行语义检查。 |
![]() |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
![]() |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
![]() |
rainer · 后台插入程序的初始化 1 年前 |
![]() |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
|
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |