不匹配运营商<<在std :: cout中

时间:2011-04-18 19:27:52

标签: c++ vector cout

我正在尝试打印矢量中的每个元素,如下所示:

vector<users>::iterator i;

for(i = userlist.begin(); i<userlist.end(); i++)
{
        cout << *i << "\n";
}

然后我收到这样的错误:

no match for 'operator<<' in 'std::cout << (&i)->__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = users*, _Container = std::vector<users, std::allocator<users> >]()' 

我错过了什么明显的事情?

5 个答案:

答案 0 :(得分:6)

您是否定义了具有此签名的函数?:

std::ostream & operator<<(std::ostream &, const users &);

它应该成为用户的成员函数,尽管它可能是也可能不是朋友,取决于您。原型应该放在类用户的头文件中,正文应该放在源(.cpp)文件中。我不知道你的用户类是如何定义的,或者你想如何格式化输出,但函数定义应如下所示:

std::ostream & operator<<(std::ostream & os, const users & U)
{
    os << U.some_data_members;
    os << U.and_or_some_member_functions();
    os << whatever;
    return os;
}

答案 1 :(得分:2)

一旦定义了std::ostream &operator<<(std::ostream &, user&);,请考虑将代码更改为使用std::copy而不是for循环:

// leaving off the `std::`, you're not using it for `cout`.
// 
copy(userlist.begin(), userlist.end(), ostream_iterator<user>(cout, "\n"));

答案 2 :(得分:1)

您是否为用户类定义了流运算符?如果没有,请这样做。

答案 3 :(得分:1)

您需要编写ostream::operator<<()的重载,其中包含users的实例,或者编写一些转换运算符,该运算符将提供从user到某种类型的自动转换operator<<()个版本知道。

答案 4 :(得分:1)

您需要定义自己的公共函数运算符&lt;&lt;获取ostream和用户的参数:

std::ostream& operator<<(std::ostream&, users&);

抱歉,是users还是user