Así es, omití el detalle del espacio al momento de invocar templates anidados:
ostream_iterator<MyPair<string, string>>(); // mal
ostream_iterator<MyPair<string, string> >(); // bien
y salia sobrando un typename. (edité el código anterior con la corrección).
Lo último que mencionas funciona:
Código C++:
Ver originalnamespace std{
template<class T1, class T2>
istream& operator>>(istream& is, pair<T1, T2>& p){
return is >> p.first >> p.second;
}
template<class T1, class T2>
ostream& operator<<(ostream& os, const pair<T1, T2>& p){
return os << "[" << p.first << ", " << p.second << "]";
}
}
Solo que tendrás que definir el operador dentro del namespace std, algo que no es recomendable y que no siempre funciona, es para que lo tomes en cuenta.
Saludos.