2016-04-14 14 views
0

Helo。誰も私に出力演算子を割り当てることができますが、その上でコピーを実行することはできません。コピーはthrid引数としてOutputIterator必要がありますが、私はあなたがここで見ることができますいくつかの奇妙なエラーを持っている:http://cpp.sh/5akdx出力イテレータにコピーできません

#include <iostream> 
#include <iterator> 
#include <algorithm> 

using namespace std; 

bool space(const char &c) { 
    return c == ' '; 
} 
bool not_space(const char &c) { 
    return !space(c); 
} 

template<class Out> 
void split(const string &str, Out os) { 
    typedef string::const_iterator iter; 
    iter i = str.begin(); 
    while (i != str.end()) { 

     i = find_if(i, str.end(), not_space); 

     iter j = find_if(i, str.end(), space); 

     if (i != str.end()) 
      //*os++ = string(i, j); //THIS WORKS 
      copy(i, j, os); //THIS DOESN'T WORK 
     i = j; 
    } 
} 

int main() 
{ 
    string s; 
    while (getline(cin, s)) 
     split(s, ostream_iterator<string>(cout, "\n")); 
    return 0; 
} 

問題を、これは

*os++ = string(i, j); 

を動作することである。しかし、それはしていません:

​​
+1

'std :: ostream_iterator 'が必要です。 'string'ではなく' char'に注意してください。 'i'と' j'は 'string'に' char'を繰り返します。 – WhozCraig

答えて

1
*os++ = string(i, j); 

この行は、2つの文字イテレータから1つの文字列を作成し、t出力イテレータ。

​​

この行は、イテレータ範囲の各文字を出力イテレータに書き込もうとします。

これは、最初の行が出力イテレータに文字列を書き込む間に、2行目が個々の文字の書き込みを試みることを意味します。これらの2つの型は互換性がなく、特に出力イテレータは文字列のみを受け入れます。それが問題です。

関連する問題