Rozważmy następujący program:Gdzie powinienem zdefiniować operatora >> dla mojej specjalizacji 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
}
To nie skompilować bo jak tylko operator >> ADL znajdzie się w przestrzeni nazw std go nie uwzględnia zakres globalny więcej, niezależnie od tego, czy operator znaleźć w std było wykonalny kandydat lub nie. Jest to dość niewygodne. Jeśli umieszczę deklarację mojego operatora >> w przestrzeni nazw std (która jest technicznie nielegalna) kod kompiluje się dobrze zgodnie z oczekiwaniami. Czy istnieje sposób, aby rozwiązać ten problem, zamiast tworzyć własną klasę zamiast typowania jej jako specjalizacji szablonu w przestrzeni nazw standardowej?
góry dzięki
Nie jesteś specjalizujący 'std :: pair' tutaj. Myślę, że ma to więcej wspólnego ze sposobem analizowania kodu szablonu, niż z samym ADL. –