0

第5.9章の終わりに11の演習を行おうとしています。BjarneStroustrupC++プログラミング言語。

  1 #include <iostream>
  2 #include <string>
  3 #include <vector>
  4 #include <algorithm>
  5 
  6 void print(std::vector<std::string>::const_iterator str) {
  7    std::cout << *str;
  8 }
  9 
 10 int main(void) {
 11    std::vector<std::string> words;
 12    std::string tmp;
 13 
 14    std::cin >> tmp;
 15    while (tmp != "Quit") {
 16       words.push_back(tmp);
 17       std::cin >> tmp;
 18    }
 19 
 20    for_each(words.begin(), words.end(), print);
 21 
 22    return 0;
 23 }

20行のコメントを外すと、次のエラーが発生します。

In file included from /usr/include/c++/4.7/algorithm:63:0,
                 from 5.9.11.cpp:4:
/usr/include/c++/4.7/bits/stl_algo.h: In instantiation of ‘_Funct std::for_each(_IIter, _IIter, _Funct) [with _IIter = __gnu_cxx::__normal_iterator<std::basic_string<char>*, std::vector<std::basic_string<char> > >; _Funct = void (*)(__gnu_cxx::__normal_iterator<const std::basic_string<char>*, std::vector<std::basic_string<char> > >)]’:
5.9.11.cpp:20:44:   required from here
/usr/include/c++/4.7/bits/stl_algo.h:4442:2: error: could not convert ‘__first.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator*<std::basic_string<char>*, std::vector<std::basic_string<char> > >()’ from ‘std::basic_string<char>’ to ‘__gnu_cxx::__normal_iterator<const std::basic_string<char>*, std::vector<std::basic_string<char> > >’

コンパイルコマンド:

g++ prog.cpp -o prog -Wall

私が間違ったことは何ですか?

4

2 に答える 2

2

コールバック関数はstd::string、イテレータではなく、を取る必要があります。for_each各要素自体を渡します。したがって、関数は次のようになります。

void print(const std::sting &str) {
    std::cout << str << ' '; //note I separated the words
}

修正された例(std::on for_each、およびその他のいくつかの小さな違いを含む)については、この実行を参照してください。

-std=c++0xC ++ 11(またはを介してコンパイラにアクセス可能)では、 C ++ 11がranged-forループを導入したため、コンテナをループすることを-std=c++11心配する必要はありません。std::for_each

for (const std::string &str : words)
    std::cout << str << ' ';
于 2012-08-17T16:09:32.723 に答える
1

すでにchrisによって述べられているように、print()関数はconst std::string&. 別の方法として、ラムダ関数を使用できます。

std::for_each(words.begin(),
              words.end(),
              [](const std::string& a_s)
              {
                  std::cout << a_s << "\n";
              });

コンパイラ フラグを追加し-std=c++0xます。

于 2012-08-17T16:15:42.800 に答える