为什么我得到这个模板编译错误?

时间:2014-12-29 12:07:23

标签: c++ templates

我正在学习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:\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)
     ^

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

我缺少什么?

问候 加特。

1 个答案:

答案 0 :(得分:2)

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

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