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

时间:2015-10-22 14:09:38

标签: c++ operator-overloading

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

我尝试了以下

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

int main() {
  bool (*f)(S, S) = &operator==;
}

但是gcc给出了错误

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

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

bool operator==(S, S);

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

2 个答案:

答案 0 :(得分:5)

  

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

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

一般来说,你应该总是在一个班级之外宣布你的朋友,除非你明确地想要将他们隐藏在除ADL之外的任何查找中(这可能是好主意而可能不是,我没有足够的经验来判断,这实际上取决于一种情况。)。

答案 1 :(得分:2)

  

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

不,名称在类的范围内,您不能直接使用它。

从标准,11.3 $ 6,7朋友[class.friend](由我粗体)

  

6如果和,可以在类的朋友声明中定义函数   只有当类是非本地类(9.8)时,函数名才是   不合格,并且该函数具有命名空间范围。

     

7这样的功能是隐式内联的。朋友函数定义在   class在类的(词法)范围内是,在其中定义它。一个   在课外定义的友元函数不是(3.4.1)。