2011-07-30 14 views
15

考慮下面的程序:我應該在哪裏定義運算符>>用於我的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 
} 

此故障後,會編譯,因爲作爲ADL認爲運營商>> std下它不考慮全球範圍內的任何更不論在性病中發現的經營者是否是可行的候選人與否。這很不方便。如果我將我的操作符>>的聲明放入命名空間std(這在技術上是非法的),代碼將按預期編譯。有沒有什麼辦法可以解決這個問題,而不是讓我自己的類變成point,而不是將它定義爲std命名空間中模板的專門化?

預先感謝

+0

你是不是專業'的std ::這裏pair'。我認爲這與模板化代碼解析的方式有關,而不是ADL本身。 –

回答

11

namespace std添加的operator>>過載是禁止的,但添加模板專業化有時允許的。

但是,這裏沒有用戶定義的類型,標準類型的操作符不是您要重新定義的操作符。專業operator>>(istream&, pair<mytype, int>)將是合理的。


[namespace.std](部分n3290的17.6.4.2.1)表示

一個C如果其添加聲明或定義到命名空間std或一個命名空間的命名空間std內++程序是未定義的行爲除非另有規定。 僅當聲明取決於用戶定義類型且專業化符合原始模板的標準庫要求並且未明確禁止時,程序可以將任何標準庫模板的模板專用化添加到名稱空間std

(重點煤礦)

+0

你的答案是否意味着我的問題的答案是***沒有***,我應該使'point'成爲一個單獨的課程? –

+0

說到Ben Voigt,我會說是的,它確實如此。 –

+0

@Benoit:順便說一句,我不明白標準類型的操作符不是我的_re_define。沒有操作員>>對,所以我不是_re_defining什麼,是嗎? –

相關問題