2017-12-06 4 views
-2

私は現在、私はマトリックス形式のベクトルの内容を印刷するような構造体の私のベクトルにoverload operator<<を作るしようとしていますが...ポインタのベクトル構造体に対するオーバーロード演算子<<?

これは私がこれまで

// This file is a "Hello, world!" in C++ language by GCC for wandbox. 
#include <iostream> 
#include <cstdlib> 
#include <vector> 
#include <algorithm> 

struct element 
{ 
    std::vector<int> keys; 
    std::string item; 

    element(std::vector <int> key, std::string item) 
    { 
     keys = key; 
     this->item = item;   
    } 

}; 


inline std::stream operator << (std::ostream &stream, const std::vector<element*> _element) 
{ 
    for (auto elements: _element) 
    { 
     for(auto item : elements) 
     { 
      std::stream << item.key << " " 
     } 
    } 

} 


int main() 
{ 
    std::cout << "Hello, Wandbox!" << std::endl; 
    std::vector<element> storage; 
    std::vector<int> test(10); 
    std::generate(test.begin(), test.end(), []() { 
    return rand() % 100; 
}); 
    std::string name = "test"; 
    storage.push_back(element(test,name)); 
    std::generate(test.begin(), test.end(), []() { 
    return rand() % 100; 
}); 
    storage.push_back(element(test,name)); 
    std::generate(test.begin(), test.end(), []() { 
    return rand() % 100; 
}); 
    storage.push_back(element(test,name)); 

    std::vector<element*> copy_of_storage; 
    for(auto elements: storage) 
    { 
     copy_of_storage.push_back(&(elements)); 
    } 


    std::cout << copy_of_storage << std::endl; 

} 

を試みたものです

何らかの理由でそれが機能していないため、何がうまくいかないのか分からないようですか?

https://wandbox.org/permlink/BQpqmz0HwoXgyS7t

+0

コンパイルエラーを読もうとしましたか? –

+0

私はコンパイラエラーと(おそらく)タイプミスを修正し、私のマシンで動作しました。まあ、私はそれが動作することを意図して動作すると仮定します。 – Eljay

+1

要素内の項目は、 'for(auto item:elements-> keys) 'とするべき問題です。 –

答えて

0

あなたのオペレータ< <で間違っているものがたくさんあります。

まず、戻り値の型はstd :: ostream &である必要があります。したがって、ストリームを返す必要があります。あなたの第二のループでは:

for(auto item : elements) 

要素要素のポインタ(あなたのベクトルの値型)であるので、あなたが他にそれを繰り返すことはできませんが、あなたは他のelements->キー

を反復する場合がありますここで

あなたの固定機能である:

inline std::ostream& operator<< (std::ostream &stream, const std::vector<element*> _element) 
{ 
    for (auto elements: _element) 
     for(auto item : elements->keys) 
      stream << item << " "; 
    return stream; 
} 

https://wandbox.org/permlink/qNYVx2yMg7L76NWe

0

コード例を修正するためにできることはいくつかあります。より良い命名規則は重要なスタートになるでしょう。

あなたのコードが機能しない理由は、オペレーターのためです。< <機能。以下は動作します:

std::ostream& operator << (std::ostream &stream, std::vector<element*> _elements) 
{ 
    for (auto element : _elements) 
    { 
     for(auto item : element->keys) 
     { 
      stream << item << " "; 
     } 
    } 
    return stream; 
} 

あなたの作業例:さらにhttps://wandbox.org/permlink/FVXbLlXEAJpVbfAx

  • はあなたのコードをリファクタリング - より良い変数名を。
  • 要素の初期化リストを要素のコンストラクタで使用してみます。 ctorパラメータをconst &に変更する価値があります。
  • オペレータ< <は、std :: ostream &を返す必要があります。
  • operators <<のparamリストにinlineキーワード
  • を削除することは非constポインタを含むベクターのコピーであることから、あなたはstd::vector<element*>からconstを削除することができます。
関連する問題