如何在C++中获取在类体中定义为朋友的重载运算符的地址

vit*_*aut 4 c++ operator-overloading

如何获取在类体中定义为朋友的重载运算符的地址?

我尝试了以下内容

struct S {
  friend bool operator==(S, S) { return true; }
};

int main() {
  bool (*f)(S, S) = &operator==;
}
Run Code Online (Sandbox Code Playgroud)

但是gcc给出了一个错误

test.cc: In function ‘int main()’:
test.cc:6:30: error: ‘operator==’ not defined
   bool (*f)(S, S) = &operator==;
                              ^
Run Code Online (Sandbox Code Playgroud)

可以通过在(全局)命名空间中声明运算符来修复:

bool operator==(S, S);
Run Code Online (Sandbox Code Playgroud)

有没有办法在没有重新声明运营商的情况下获取地址?

Pet*_*etr 5

在类或类模板X中的友元声明中首先声明的名称成为X的最内层封闭命名空间的成员,但是无法进行查找(除了依赖于参数的查找X),除非命名空间范围内的匹配声明是提供

http://en.cppreference.com/w/cpp/language/friend,强调我的.

一般来说,你应该总是在一个类之外声明你的朋友,除非你明确地希望将它们隐藏在除ADL之外的任何查找中(这可能是好主意而可能不是,我没有足够的经验来判断,这真的取决于情况.