2

クエリの代わりにオブジェクトのベクトルを取得するgsoapWebサービスを開発しています。それを行うには2つの方法があります。1つは単純なループによる方法、もう1つはイテレータによる方法です。それらのどれも働いていません。

エラーは次のとおりです。

エラー:に一致するものがありませ'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日間を費やしました。)

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::cout1つ)であり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値ですPersonInfooperator<<コンパイラは、型の右側の引数を取るものがないことを訴えてい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

それがあなたに言っているのは、* itの内容をcout(コンソール出力)するための既知の方法がないということです。

itイテレータです-これをリスト内のポインタのように考えてください

リストはinfoそうです*それはアイテムinfoのリストであるの現在のPersonInfoアイテムです。

つまり、現在参照しているcout << *it;コンソールへの出力を言います。PersonInfo

しかし、エラーメッセージは、コンパイラがPersonInfoをコンソールにレンダリングする方法を知らないことを示しています。

行う必要があるのは、()であるオブジェクトとオブジェクトを取得し、のさまざまなビットをに書き込むという演算子<<cout作成ostreamするPersonInfoことPersonInfoですcout

于 2013-03-16T13:00:47.880 に答える