15

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

+0

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. –

Odpowiedz

11

dodanie przeciążenie operator>> w namespace std jest zabronione, ale dodając specjalizacji szablonu czasami jest dozwolone.

Jednak tutaj nie ma żadnych typów zdefiniowanych przez użytkownika, a operatorzy standardowych typów nie są twoimi nowymi. Specjalizacja operator>>(istream&, pair<mytype, int>) byłaby rozsądna.


sekcja [namespace.std] (sekcja 17.6.4.2.1 z n3290) mówi

zachowanie w C++ Program jest niezdefiniowana jeśli dodaje deklaracji lub definicji do przestrzeni nazw std lub do przestrzeni nazw wewnątrz przestrzeni nazw std o ile nie podano inaczej. Program może dodać specjalizację szablonu dla dowolnego standardowego szablonu biblioteki do przestrzeni nazw std tylko wtedy, gdy deklaracja zależy od typu zdefiniowanego przez użytkownika, a specjalizacja spełnia standardowe wymagania biblioteki dla oryginalnego szablonu i nie jest wyraźnie zabroniona.

(Kopalnia nacisk)

+0

Czy twoja odpowiedź sugeruje, że odpowiedź na moje pytanie brzmi *** nie *** i powinienem zrobić "punkt" jako oddzielną klasę? –

+0

Mówiąc dla Ben Voigt, powiedziałbym, że tak, to prawda. –

+0

@Benoit: Nawiasem mówiąc, nie rozumiem, że operatorzy na standardowych typach nie są moimi, aby _re_define. Nie ma operatora >> dla pary, więc nic nie definiuję, prawda? –

Powiązane problemy