2013-04-09 92 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