简体   繁体   中英

Why am i getting this template compile error?

Am learning C++ STL, and am trying out a small program but am getting some weird template error when compiling, my code looks like this;

template<class InputIterator,  class OutputIterator, class Predicate>
OutputIterator remove_cpy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred)
{
    while (first != last){
        if (!pred(*first)) *result = *first;
        ++ first; 
    }

    return result;
}

bool is_manager(const Employee& emp){
    return emp.title == "manager";
}

struct Employee{
    std::string name;
    std::string title;
};

int main()
{
  vector<Employee> v;

  // create e1 to e4
  Employee e1;
  e1.name = "john";
  e1.title = "accountant";
  ...
  e4.title = "manager";

  // add e1 to e4 to vector
  v.push_back(e1);
  ...
  v.push_back(e4);

  remove_cpy_if(v.begin(), v.end(), std::ostream_iterator<Employee>(cout), is_manager);
  ....
}

I try compiling i get;

$ g++ -o test test.cpp -std=c++11

In file included from c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\iterator:66:0,
                 from test.cpp:5:
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stream_iterator.h: In instantiation of 'std::ostream_iterator<_Tp, _CharT, _Traits>& st
d::ostream_iterator<_Tp, _CharT, _Traits>::operator=(const _Tp&) [with _Tp = Employee; _CharT = char; _Traits = std::char_traits<char>]
':
test.cpp:19:30:   required from 'OutputIterator remove_cpy_if(InputIterator, InputIterator, OutputIterator, Predicate) [with InputItera
tor = __gnu_cxx::__normal_iterator<Employee*, std::vector<Employee> >; OutputIterator = std::ostream_iterator<Employee>; Predicate = bo
ol (*)(const Employee&)]'
test.cpp:78:95:   required from here
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stream_iterator.h:198:13: error: cannot bind 'std::ostream_iterator<Employee>::ostream_
type {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
  *_M_stream << __value;
             ^
In file included from c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\iostream:39:0,
                 from test.cpp:1:
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ostream:602:5: error:   initializing argument 1 of 'std::basic_ostream<_CharT, _Traits>& std
::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = Employee]'

     operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x)
     ^

Compiling using Mingw g++ 4.8.1, Windows 7 SP1

What am i missing?

regards Gath.

You never define how an Employee should be outputed.
Just implement the following function and you will be good!

std::ostream&
operator<<(std::ostream& out, const Employee& e)
{
    /* Print an Employee. */
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM