Два слова: поиск имени.
Вот упрощенный пример того, что вы пытаетесь сделать, без каких-либо заголовков стандартной библиотеки:
template <typename T> void f(T) { }
namespace ns {
class C { };
void f(int) { }
void test() { f(C()); } // doesn't work :'(
}
int main() {
f(ns::C()); // works! :-D
}
В этом примере в main()
только f
, которыйво время обычного поиска имени является шаблоном функции в глобальном пространстве имен, и он совпадает, поэтому main
использует его (ns::f
также найдено во время зависимого от аргумента поиска, но это не совпадение, поэтому глобальный f
все еще выбирается во время разрешения перегрузки).
В test
, однако, перегрузка ns::f(int)
обнаружена, и поиск имени останавливается.Пространства имен ищутся вовне, поэтому сначала ищется ns
, затем - глобальное пространство имен, но поиск имени останавливается после того, как имя найдено, поэтому, когда ns::f(int)
найдено, поиск имени останавливается.Зависимый от аргумента поиск также имеет место и находит ns::f(int)
, поскольку C
находится в пространстве имен ns
, тогда ADL прекращает поиск.
То же самое верно в вашем примере: в main()
Перегрузка operator<<
обнаружена, но внутри std::ostream_iterator
, который находится в пространстве имен std
, обнаружены другие перегрузки <<
, поэтому ваша перегрузка не найдена.
Ваш operator<<
Перегрузка должна быть в пространстве имен std
, чтобы она работала, но, к сожалению, вы не можете добавлять имена в пространство имен std
.