次のプログラムを検討してください。
#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名前空間のテンプレートの特殊化としてタイプ定義するのではなく、独自のクラスを作成する以外に、この問題を解決する方法はありますか?
前もって感謝します