我正在开发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 ++的新手,我花了三天时间来寻找解决方案。)
答案 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
类型的表达式,其中A
是std::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应该如何呈现给控制台。
您需要做的是创建一个名为<<
的运算符,该运算符接受cout
为ostream
的对象和PersonInfo
对象,然后写入各个位PersonInfo
至cout
。