| 分類:[C/C++]
個人的に納得がいかないのでどなたか解説していただけると幸甚の至り。
うまくいく例 typedef std::string value_type; // ここをいろいろ差し替える予定がある typedef std::vector<value_type> container_type; // list になる可能性がある // value_type を出力する先が cout/wcout 両方になる可能性があるので basic_ostream で実装 // このオレオレ operator<< は当然無名名前空間においてあり std 内ではない template<typename charT, typename Traits> std::basic_ostream<charT, Traits>& operator<<(std::basic_ostream<charT, Traits>& s, const value_type& v) { return s; // 例なので何も出力しなくていい } int main() { container_type c; // value_type を cout に出力したい (将来的には wcout になる可能性あり) std::copy(c.begin(), c.end(), std::ostream_iterator<value_type>(std::cout, "\n")); } これは VC++(2005) gcc-4.2.2 とも期待通りの動作をする。 期待通りとは、 ostream_iterator がちゃんとオレオレ operator<< を見つけ コンパイル・リンクでき、実行できる(この例では何も出力されない)、ということ。
うまくいかない例 typedef std::pair<std::string, std::string> value_type; // 他はすべて同一 とすると ostream_iterator がオレオレ operator<< を見つけられなくなってしまう ADL が効いていないというべきか、効きすぎているといべきか? オレオレ operator<< を namespace std 内で定義するとうまくいくので (違反だけど)
なぜ、無名名前空間に配置したオレオレ operator<< が 前者<std::string> では見つかり後者<std::pair<...> > では見つからないの?
|