VC++7.1で以下のコードが通らない.ちょっとショック.
class C{ friend void f(){ } }; int main(int argc, char *argv[]) { f(); // コンパイルエラー:fが見えていない(gcc3.2.2ではもちろんOK) return 0; }
要するにクラススコープで定義されたfriend関数は名前空間に名前がinjectされない.これ専用のコンパイルエラー(C3767)まで用意されている.代わりに以下のコードならADLでfが見えるということらしい.
struct C{ public: friend void f(C &){ } }; int main(int argc, char *argv[]) { C c; f(c); // OK return 0; }
確かにfriendの意味からすればVC++7.1の仕様は非常に納得のいくものなんですが,標準への準拠という視点からすればどう考えても規格(11.4 -5-)違反の気がする.余計なことしてくれてるという印象.ま,名前空間で定義すれば良いだけの話なんですけれどね.ただ,クラステンプレート + friendを使ってクラスの実体化で名前空間への関数の導入を制御して何か面白い遊びが出来ないかなぁ〜と考えていたのに,VCだとこの遊びが出来ないということに・・・.(´・ω・`)ショボーン