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 ?
※解釋器里出錯列印調用堆棧是怎麼實現的?