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指定されていないということは変更不可。
よろしくお願いします。