与 std::cout 中的运算符<<不匹配

No match for operator << in std::cout

本文关键字:lt 不匹配 运算符 std cout      更新时间:2023-10-16

我试着像这样打印一个向量中的每个元素:

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> >]()' 

有什么明显的我错过了吗?

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

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

一旦你定义了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"));

是否为users类定义了流操作符?

您需要编写一个ostream::operator<<()的重载,它接受users的一个实例,或者编写一些转换操作符,它将提供从useroperator<<()版本之一知道的某种类型的自动转换。

您需要定义自己的公共函数operator<<接受ostream和users的形参:

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

对不起,是users还是user ?