C++命名空間的問題:這是編譯器Bug嗎?

#include &

class B
{
int b;
};

namespace A { class window; }

B f(A::window);

namespace A
{
class window{
private:
int w;
friend ::B
::f(window); // no type named f in B
// 感覺是識別成了B::f?
};
}

B f(A::window w) { std::cout &<&< w.w &<&< std::endl; } int main() { A::window a; f(a); }

在GCC 5.3/Clang 3.7.1下均報no type named f in B


因為您的friend聲明被看作了:

friend ::B::f (window);

也就是說::B::f被看作一個單元,作為返回類型。這顯然不是您要的。

只要在::f兩邊加括弧就好了:

friend ::B (::f)(window);

完整代碼:

#include &

class B
{
int b;
};

namespace A { class window; }

B f(A::window);

namespace A
{
class window{
private:
int w;
friend ::B (::f)(window); // parens!
};
}

B f(A::window w) {
std::cout &<&< w.w &<&< std::endl; return B; } int main() { A::window a; f(a); }


推薦閱讀:

對於stdio.h 之類的頭文件,在C++中使用時,編譯器是怎樣處理的?
Phi node 是如何實現它的功能的?
如何抽象評判現有語言優劣,繼而設計一款別具優雅的計算機語言 X ?
解釋器里出錯列印調用堆棧是怎麼實現的?

TAG:C | 編譯器 | C標準 | 命名空間 |