与'operator<<'不匹配在std :: cout中

时间:2013-03-16 12:53:23

标签: c++ cout

我正在开发gsoap web服务,我正在检索对象的向量以回复查询。我有两种方法可以做到:首先是简单循环和迭代器。他们都没有工作。

错误是:

  

错误:'operator<<'中的'std::cout mPer.MultiplePersons::info.std::vector<_Tp, _Alloc>::at<PersonInfo, std::allocator<PersonInfo> >(((std::vector<PersonInfo>::size_type)i))'不匹配   

MultiplePersons mPer; // Multiple Person is a class, containing vector<PersonInfo> info
std::vector<PersonInfo>info; // PersonInfo is class having attributes Name, sex, etc.
std::vector<PersonInfo>::iterator it;

cout << "First Name: \t";
cin >> firstname;
if (p.idenGetFirstName(firstname, &mPer) == SOAP_OK) {
    // for (int i = 0; i < mPer.info.size(); i++) {
    //    cout << mPer.info.at(i); //Error
    //}
    for (it = info.begin(); it != info.end(); ++it) {
        cout << *it; // Error
    }

} else p.soap_stream_fault(std::cerr);

}

显然,operator<<中的运算符重载cout是问题所在。我已经看过几个与此相关的问题,但没有人帮助过我。如果有人可以提供一个如何解决它的具体例子,那将非常感激。 (请不要一般性地谈论它,我是C ++的新手,我花了三天时间来寻找解决方案。)

3 个答案:

答案 0 :(得分:6)

您需要为PersonInfo提供输出流运算符。像这样:

struct PersonInfo
{
  int age;
  std::string name;
};

#include <iostream>
std::ostream& operator<<(std::ostream& o, const PersonInfo& p)
{
  return o << p.name << " " << p.age;
}

此运算符允许使用A << B类型的表达式,其中Astd::ostream个实例(其中std::cout为1)且B为{ {1}}实例。

这允许你做这样的事情:

PersonInfo

反过来允许您打印取消引用的迭代器。

答案 1 :(得分:1)

*it的结果是PersonInfo类型的L值。编译器抱怨没有operator<<采用PersonInfo类型的右侧参数。

要使代码生效,您需要提供这样的运算符,例如:

std::ostream& operator<< (std::ostream &str, const PersonInfo &p)
{
  str << "Name: " << p.name << "\nAge: " << p.age << '\n';
  return str;
}

运算符的确切实现取决于您在输出中表示类的需要。

答案 2 :(得分:0)

它告诉你的是,没有一个已知的wout(控制台输出)* it的内容。

it是一个迭代器 - 把它想象成列表中的指针

列表为info所以*它是info中的当前项目,这是PersonInfo个项目的列表。

因此cout << *it;向控制台输出当前正在引用的PersonInfo

但是错误消息告诉您编译器不知道PersonInfo应该如何呈现给控制台。

您需要做的是创建一个名为<<的运算符,该运算符接受coutostream的对象和PersonInfo对象,然后写入各个位PersonInfocout