No matching constructor for initalization of 'ostream_iterator'

前端 未结 3 1021
清歌不尽
清歌不尽 2020-12-19 13:33

for the code, why error, osteam_iterator is a template class ,why no matching constructor for initalization of \'ostream_iterator\', please give a help , thank you. define o

相关标签:
3条回答
  • 2020-12-19 14:02

    ostream_iterator constructor takes const CharT* delim as second parameter:

    ostream_iterator(ostream_type& stream, const CharT* delim) (1)

    ostream_iterator(ostream_type& stream) (2)

    To make your code work, you need to pass in a string:

    std::copy(sentence1.begin(), sentence1.end(), std::ostream_iterator<int>(cout, "1"));
    //                                                                             ^^^^
    
    0 讨论(0)
  • 2020-12-19 14:03

    The std::ostream_iterator takes a string as the second parameter to the constructor. This is the string that will be output after each integer in the sequence.

    0 讨论(0)
  • 2020-12-19 14:19

    The ostream_iterator class definition looks like:

    template< class T,
      class CharT = char,
      class Traits = std::char_traits<charT>>
    class ostream_iterator /*...*/
    

    whereas the respective constructor is declared as:

    ostream_iterator(ostream_type& buffer, const CharT* delim)
    

    Since the second template argument of an ostream_iterator is required to be of character type you cannot simply replace it with int.

    If you ommit the second template parameter you can plug in a string literal of type char const *:

    std::copy(sentence1.begin(), sentence1.end(), std::ostream_iterator<int>(cout, ","));
    

    If C++11 is available to you then

    int c = 5;
    for ( auto v : sentence1 ) std::cout << v << c;
    

    is another way of doing what you deserve and it might be suitable, too. The advantage is, that operator<< is more flexible than an argument of type "pointer to char type".

    0 讨论(0)
提交回复
热议问题