Проблема в том, что поиск имени не находит ваш operator<<(ostream& os, const PAIR& r)
.Код, который пытается вызвать operator<<
, находится где-то внутри ostream_iterator<>
, которое находится внутри пространства имен std
.Поиск имени ищет правильную функцию внутри ostream_iterator<>
и пространства имен std
;зависимый от аргумента поиск здесь не помогает, потому что оба параметра также находятся в пространстве имен std
.
Итак, я предлагаю (1) либо заключить ваш оператор в namespace std { }
, но этоUB, IIRC.Или (2) создайте структуру, унаследованную от std::pair
, чтобы определить новый тип в вашем пространстве имен, и с помощью ADL найдите ваш operator<<()
.
ОБНОВЛЕНИЕ:
Мое третье предложение - использовать пользовательский манипулятор для распечатки пары.
Что касается моего 2-го предложения, если вы можете использовать C ++ 11, наследование от std::pair
должно быть простым (не проверено):
struct PAIR : std::pair
{
using std::pair::pair;
};
Если вы не можете использовать C ++ 11, тогда я предлагаю использовать пользовательский манипулятор.