如此处所述,模板实例化类成员函数上的 C++11 样式 SFINAE 和函数可见性使自由函数黯然失色。使用完全限定的名称通常有效,但是我很难使用其他类的内联声明的友元函数。考虑以下示例:
namespace N {
struct C {
friend int f(const C& c) {
return 1;
}
friend int g(const C& c) {
return 2;
}
};
struct D {
void f() {
g(C{}); // ADL finds this
::N::f(C{}); // not found dispite full qualification
}
};
}
我想我明白问题是什么,如此处所述内联友元函数的范围是什么?内联友元函数通常使用 ADL 找到,并且在封闭的命名空间中并不真正可见。
所以我的问题是我应该如何更改我的代码以使其正常工作(除了重命名 f 之一)?