如何获取在类体中定义为朋友的重载运算符的地址?
我尝试了以下
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);
有没有办法在不重新声明运营商的情况下获取地址?
答案 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)。