Considere el siguiente programa:¿Dónde debería definir operator >> para mi especialización de 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
}
Esta falla al compilar porque tan pronto como ADL encuentra el operador >> en el espacio de nombres std que no tiene en cuenta el alcance global de más, independientemente de si el operador se encuentra en std era una candidato viable o no. Esto es bastante inconveniente. Si coloco la declaración de mi operador >> en el espacio de nombres estándar (que es técnicamente ilegal), el código se compila bien como se esperaba. ¿Hay alguna manera de resolver este problema que no sea hacer point
mi propia clase en lugar de typedefing como una especialización de una plantilla en el espacio de nombres std?
Gracias de antemano
No estamos especializados 'std :: pair' aquí. Creo que esto tiene más que ver con la forma en que se analiza el código con plantilla que con la propia ADL. –