Рассмотрим следующую программу:
#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?
Заранее спасибо