2013-04-09 97 views
1

继的问题在这里 如果我忽略这样的命名空间:向前声明和友元函数

void f(window); 

    class window{ 
    private: 
    int a; 
    friend void ::f(window); 
    }; 

void f(window rhs){ 
    std::cout << rhs.a << std::endl; 
} 

我得到了奇怪的行为:

friend void f(window); 

编译没有F的向前声明(窗口),但是

friend void ::f(window); 

不是:

error C2039: 'f' : is not a member of '`global namespace'' 

有人可以解释它的原因吗?为什么::使这种差异,如果我们在全球命名空间呢......

谢谢?

回答

1

如果您在朋友声明中不符合f的条件,它也像正常声明那样行事,并在周围名称空间(在您的情况下为全局)中声明f

但是,如果您明确将其限定为::f,则不再是f的声明,而只是希望引用已声明的f的朋友声明。但没有,因此错误。

+1

这比这更复杂一点。不合格的,朋友声明在最近的周围名称空间中声明函数,但它只将名称引入类(但当然,它将使用ADN找到)。 – 2013-04-09 11:34:28

+0

我会接受@ Angew的回答,但我只是用gcc测试了这个代码,并且这两种情况都是在没有前向声明的情况下编译的......任何人都可以解释为什么? – 2013-04-09 12:11:37