2

我正在开发 gsoap Web 服务,我在其中检索对象向量以返回查询。我有两种方法可以做到这一点:首先通过简单循环和迭代器。他们都没有工作。

错误是:

'operator<<'错误: in不匹配'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++ 新手,我花了三天时间寻找解决方案。)

4

3 回答 3

7

您需要为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,其中A是一个std::ostream实例(其中std::cout一个)并且B是一个PersonInfo实例。

这允许您执行以下操作:

#include <iostream>
#include <fstream>
int main()
{
  PersonInfo p = ....;
  std::cout << p << std::endl; // prints name and age to stdout

  // std::ofstream is also an std::ostream, 
  // so we can write PersonInfos to a file
  std::ofstream person_file("persons.txt");
  person_file << p << std::endl;
}

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

于 2013-03-16T12:56:49.837 回答
1

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

要使代码正常工作,您需要提供这样的运算符,例如:

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

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

于 2013-03-16T12:59:31.770 回答
0

它告诉你的是没有已知的方法来 cout(控制台输出)*it 的内容。

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

该列表是info如此 *它是 中的当前项目info,这是一个PersonInfo项目列表。

所以cout << *it;说输出到控制台PersonInfo是它当前引用的。

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

您需要做的是创建一个名为的运算符,该运算符<<接受一个cout为 ( ostream) 的对象和一个PersonInfo对象,然后将 to 的各个位PersonInfo写入cout

于 2013-03-16T13:00:47.880 回答