Где я должен определить оператор >> для моей специализации std :: pair?

Рассмотрим следующую программу:

#include <iostream>
#include <iterator>
#include <vector>
#include <utility>
using namespace std; //just for convenience, illustration only

typedef pair<int, int> point; //this is my specialization of pair. I call it point

istream& operator >> (istream & in, point & p)
{
    return in >> p.first >> p.second;
}

int main()
{
    vector<point> v((istream_iterator<point>(cin)), istream_iterator<point>()); 
    //             ^^^                         ^^^        
    //extra parentheses lest this should be mistaken for a function declaration
}

Она не может быть скомпилирована, потому что как только ADL находит оператор >> в пространстве имен std, он больше не учитывает глобальную область видимости независимо от был ли оператор, найденный в std, жизнеспособным кандидатом или нет. Это довольно неудобно. Если я помещаю объявление моего оператора >> в пространство имен std (что технически незаконно), код компилируется должным образом. Есть ли какой-либо способ решить эту проблему, кроме как сделать point моим собственным классом вместо того, чтобы определять его как специализацию шаблона в пространстве имен std?

Заранее благодарим

15
задан Armen Tsirunyan 30 July 2011 в 18:14
поделиться