以下在全局命名空间中定义一个朋友函数,该函数声明与朋友相同的函数
class Cls {
friend void func(int) { }
friend void ::func(int);
};
so.cpp:3:17: error: ‘void func(int)’ has not been declared within ‘::’
friend void ::func(int);
^~
so.cpp:2:17: note: only here as a ‘friend’
friend void func(int) { }
^~~~
这对我来说应该没问题,它在全局名称空间中定义一个函数不是吗? gcc错误很明显是关于不喜欢only
做朋友。谁是对的?
答案 0 :(得分:5)
朋友声明本身不会使名称对不合格查询或合格查询可见。
声明:
friend void func(int) { }
确实在全局名称空间中声明名称func
。但是,不能通过非限定或限定查找来找到该名称。它只能通过ADL找到(,由于参数为int
,因此根本找不到它。{> Casey是一个铁眼的导弹人)。
让普通查询找到此func
的唯一方法是在类主体之外另外为其提供一个声明。
gcc是正确的拒绝对象。