C++相談室 part79

このエントリーをはてなブックマークに追加
955デフォルトの名無しさん
ttp://codepad.org/t3DK48jC
このようなコードがあります。
ここでnamespace NS_Aの中のものは他人が作ったコードで変更不可、namespace NS_Bの中のものは私が作ったコードで少しくらいは変更可能とします。
このコードにおいてはまあ何の問題もないわけですが、
もしもNS_A::fooが
ttp://codepad.org/xjXwEurR
のようにコメントアウトされていた場合、
g++, Comeau C++ではコンパイルエラーになりますが、
VC2008でコンパイルエラーになりません。
(ただしwarningは出ます。)

Comeau C++の挙動を盲信するとすればVC2008の困った仕様ということになりますが、
これをVC2008でもコンパイルエラーにするにはどうしたらよいでしょうか?

安直に思い浮かぶ解決案としては次の2つがありますが、これは不可として、です。
@class ClassB<T>のTは必ずしもNS_A::ClassAだとは限らないため
 friend void foo(const ClassB<T>& arg){std::cout << BOOST_CURRENT_FUNCTION << std::endl;NS_A::foo(arg.mem);} // 今回の主役2
 の様に明示的にNS_A::で修飾する訳にはいきません。
AClassB(const T& arg)はexplicit指定されていないということは変更不可。

よろしくお願いします。