aşağıdaki programı düşünün:std :: pair uzmanlığım için >> operatörünü tanımlamalıyım?
Bu ADL ad alanında >> operatörü bulur olarak bakılmaksızın std bulunan operatör bir olup olmadığı herhangi daha küresel kapsamını dikkate almaz onu std kısa sürede çünkü derlenmeyecektir#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
}
uygun aday ya da değil. Bu oldukça rahatsız edici. Operatörlüğümün beyanını >> isim alanına (teknik olarak yasal olmayan) yerleştirirsem, kod beklendiği gibi derler. Bu sorunu, std ad alanında bir şablonun uzmanlığı olarak yazmaktan ziyade kendi sınıfımdan point
kendi sınıfım yapmanın başka bir yolu var mı? namespace std
içinde operator>>
bir aşırı ekleme peşin
std :: Burada pair' 'uzmanlaşmış değildir. Bunun, şablon kodunun, ADL'nin kendisiyle olduğundan daha fazla ayrıştırılmasıyla ilgili daha fazla şey olduğunu düşünüyorum. –