2013-07-25 137 views
5

这让我感到惊讶。这工作:C++内联朋友函数与成员变量名称相同

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 
}; 

为什么没有这两个(DIS)的允许?

+1

是否返回:: x(f);'工作?这应该明确引用全局名称空间中的'x()'。 (如果'x()'不在全局命名空间中,则尝试':: the :: namespace :: x(f)'。) – cdhowie

+0

@cdhowie:“未找到**的朋友的名字**查找**或通过合格的查找**直到在该名称空间范围内提供匹配声明“。依赖于参数的查找是找到它的唯一方法,或者在类的上方添加一个声明(因为下面的类为'friend int y()'的内联声明找不到) –

+1

什么样的命名约定会导致到一个成员变量和一个朋友函数共享一个名字?这是你真正需要解决的问题。 –

回答

3

原因是,在第一种情况下,友谊将函数声明注入到封闭名称空间中,因此全局调用x只能看到一个x

在第二个示例中,x具有两个在该范围的含义:全局朋友函数和变量(可能会影响全局朋友函数)。

+2

根据http://stackoverflow.com/a/8284809/103167,不,你不能把它称为':: x(f)'。 –

+1

Ben是正确的,除非您还在名称空间级别提供声明,否则只能通过ADL访问friend函数。 –

相关问题