0

Orderオブジェクト(実際には s のベクトル)を印刷しようとしていますOrderOrderには、他のオブジェクトを持つベクトルを含む、いくつかのデータ メンバーがありますPurchase

vector<Purchase>tocoutを単独で印刷できます。メンバーを無視すると印刷できますvector<Objects>vector<Purchase>しかし、トリッキーな部分は、含めて印刷vector<Objects>することです。vector<Purchase>

これが私のコードです:

#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <algorithm>
#include <sstream>

using namespace std;

struct Purchase {
    string name;
    double unit_price;
    int count;
};

struct Order {
    string name;
    string adress;
    double data;
    vector<Purchase> vp;
};

template<typename Iter>   //this is my general print-vector function
ostream& print(Iter it1, Iter it2, ostream& os, string s) {
    while (it1 != it2) {
        os << *it1 << s;
        ++it1;
    }
    return os << "\n";
}

ostream& operator<<(ostream& os, Purchase p) {
    return os << "(" << p.name << ", " << p.unit_price << ", " << p.count << ")";
}

ostream& operator<<(ostream& os, Order o) {
    vector<Purchase> vpo = o.vp;
    ostringstream oss;
    oss << print(vpo.begin(), vpo.end(), oss, ", "); //This is what I would like to do, but the compiler doesn't like this conversion (from ostream& to ostringstream)

    os << o.name << "\n" << o.adress << "\n" << o.data << "\n"
        << oss << "\n";
    return os;
}

int main() {
    ifstream infile("infile.txt");
    vector<Order> vo;
    read_order(infile, vo);  //a function that reads a txt-file into my vector vo
    print(vo.begin(), vo.end(), cout, "");
    return 0;
}

ご覧のとおり、に渡す前に をostringstreams格納する一時変数として使用するというアイデアがありました。しかし、これはいけません。この問題の良い解決策は何でしょうか?vector<Purchase>ostream& os

私は C++ の初心者で、ストリームのさまざまな使用法を学んでいるところです。

4

2 に答える 2

2

2 つの小さなタイプミスがあるようです。

まず、指定された部分を削除します。

   oss << print(vpo.begin(), vpo.end(), oss, ", ")
// ↑↑↑↑↑↑↑

その後、同じ関数の後半で をストリーミングすることはできませんがstringstream、基になるバッファーとして機能する文字列をストリーミングすることはできるため、次のように使用しますstd::stringstream::str()

os << o.name << "\n" << o.adress << "\n" << o.data << "\n"
    << oss.str() << "\n";
//        ↑↑↑↑↑↑

これらの修正が適用され、欠落しているread_order関数が抽象化されると、プログラムはコンパイルされます。

于 2015-10-19T11:23:20.323 に答える
-2

最も簡単な方法は、operator<<a への const 参照を受け取るのオーバーロードを記述しstd::vector<Purchase>、そのベクトルを にストリーミングすることostreamです。

std::ostream& operator<<(std::ostream& os, const std::vector<Purchase>& v);
于 2015-10-19T11:23:14.453 に答える