2011-07-30 17 views
15

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

+0

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

cevap

11

yılında

Teşekkür yasaktır ama bir şablon uzmanlık ekleyerek bazen izin verilir. Bununla birlikte, burada kullanıcı tanımlı türler yoktur ve standart türlerdeki operatörler yeniden tanımlamak sizin için uygun değildir. Uzmanlaşmak operator>>(istream&, pair<mytype, int>) makul olacaktır.


bölüm [namespace.std] (bölüm n3290 ait 17.6.4.2.1)

o ad std içinde std ad alanı veya bir ad için bildirimleri veya tanımları eklerse ++ programı tanımlanmamış bir C davranışı diyor Aksi belirtilmediği sürece. Bir program, herhangi bir standart kitaplık şablonu için std ad alanı için şablon uzmanlığı ekleyebilir, ancak yalnızca kullanıcı tanımlı türüne bağlıysa ve uzmanlık, orijinal şablon için standart kitaplık gereksinimlerini karşılar ve açıkça yasaklanmazsa.

(vurgu benim)

+0

Cevabınız, benim soruma verilen cevabın *** hayır olduğunu ve “nokta” 'nın ayrı bir sınıf yapması gerektiğini ima ediyor mu? –

+0

Ben Voigt için konuşuyorum, evet diyorum, öyle. –

+0

@Benoit: Bu arada, standart tiplerdeki operatörlerin _re_define için benim olmadığını anlamıyorum. Çift için herhangi bir operatör yoktur. –