【发布时间】:2013-07-25 21:26:01
【问题描述】:
这让我很惊讶。这有效:
struct foo {
int x;
friend int x(foo f) { return f.x; }
friend int y(foo f);
};
int y(foo f) { return x(f); } // no problem
但这是一个错误:
struct foo {
int x;
friend int x(foo f) { return f.x; }
friend int y(foo f) { return x(f); } // error: invalid use of foo::x data member
};
为什么这两个(禁止)都不允许?
【问题讨论】:
-
return ::x(f);有效吗?那应该明确引用全局命名空间中的x()。 (如果x()不在全局命名空间中,请尝试::the::namespace::x(f)。) -
@cdhowie: "朋友的名字未找到通过非限定查找或通过限定查找直到在该命名空间中提供匹配声明范围”。依赖于参数的查找是找到它的唯一方法,或者在类上方添加声明(因为在类下方对于
friend int y()的内联声明来说太迟了,无法找到它) -
什么样的命名约定会导致成员变量和友元函数共享名字?这才是你真正需要解决的问题。
标签: c++ inline member friend friend-function