2013-04-23 91 views
0

我試圖連接back_inserter_iterator和CIN,我明白,我可以使用與CIN和back_inserter複製,但想知道爲什麼我不能執行以下無法連接CIN與back_insert_iterator

list<string> name; 
back_insert_iterator<list<string>> ins_it(name); 

while (cin >> ins_it); 

以下是我收到錯誤消息:

error: cannot bind ‘std::istream {aka std::basic_istream}’ lvalue to ‘std::basic_istream&&’

感謝

回答

3

wanted to know why cannot I perform the below...

的原因是std::back_insert_iterator的設計。

該類型僅在使用operator =時執行後插入。這是爲什麼std::copy確實工作。

+0

感謝您的解釋德魯,我與錯誤消息g ++扔了困惑。 「錯誤:無法綁定'std :: istream {aka std :: basic_istream }'lvalue to'std :: basic_istream &&'」 – Anandan 2013-04-24 10:40:03

+0

@Anandan這是一個相當鈍的錯誤消息,我同意。 – 2013-04-24 14:21:45

3

規範的方式來做到這一點(如果有這樣的事):

list<string> name{ 
    istream_iterator<string>{cin}, 
    istream_iterator<string>{}}; 

或:

list<string> name; 
copy(istream_iterator<string>{cin}, istream_iterator<string>{}, 
    back_inserter(name)); 
+1

這是否真的回答了這個問題? *「我明白我可以使用cin和back_inserter進行復制,但想知道爲什麼我不能執行下面的操作。」* – 2013-04-23 15:38:27

+0

@BenjaminLindley:是的,確實如此。它顯示了OP排除的關鍵步驟:使用'istream_iterator'。使用'copy'(或不)是大多不相關的;使用'istream_iterator'是這裏的區別。 – 2013-04-23 15:43:41

+0

當然,除非他使用C++ 11,否則這是行不通的。他將不得不爲'istream_iterator'使用經典的初始化器,並採取措施避免最令人尷尬的解析。 – 2013-04-23 15:47:20

0

操作>>()不是插入運營商,它是一個摘錄運營商。 後部插入器對象期望插入,而不是提取。 總結,沒有操作符>>(istream,inserter)。