为什么我会收到此模板编译错误

Why am i getting this template compile error?

本文关键字:编译 错误 为什么      更新时间:2023-10-16

正在学习C++STL,并且正在尝试一个小程序,但在编译时遇到一些奇怪的模板错误,我的代码看起来像这样;

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);
  ....
}

尝试编译我得到;

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

In file included from c:mingwlibgccmingw324.8.1includec++iterator:66:0,
                 from test.cpp:5:
c:mingwlibgccmingw324.8.1includec++bitsstream_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:mingwlibgccmingw324.8.1includec++bitsstream_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:mingwlibgccmingw324.8.1includec++iostream:39:0,
                 from test.cpp:1:
c:mingwlibgccmingw324.8.1includec++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)
     ^

使用 Mingw g++ 4.8.1、Windows 7 SP1 进行编译

我错过了什么?

问候迦特。

您从不定义应如何输出Employee
只需实现以下功能,您就会很好!

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