2016-09-23 6 views
-1

マップを使用して重複をカウントしようとしていますが、構造体のベクトルを使用しています。マップを使用して重複をカウントするC++

私はこの部分でエラーが発生しておいてください。

void display(const std::map<ChildInfo, unsigned int>& counts) { 
    for (auto count = counts.begin(); count != counts.end(); ++count) { 
     std::cout << "Value " << count->first << " has count " << count->second << std::endl; 
    } 
} 

誤差はおよそ< <オペランドであるが、私はこの問題を解決する方法は考えています。

+0

を 'COUNT-> first'を参照してんでしょうか?それは' ChildInfo'オブジェクトです。yesの場合、どのようにあなたは私を印刷するようになっている場合sを "<< operator"にオーバーロードしないでください – PRP

+0

これを[mcve]にカットすれば、重複やマップを数えることとはまったく関係ないことがわかります。 – juanchopanza

+0

@PRPなぜ私は<<演算子をオーバーロードする必要がありますか? – Hmmmmm

答えて

1

ChildInfo構造体のためにoperator<<()の過負荷を定義します。

std::ostream& operator<<(std::ostream& str, const ChildInfo& ci) { 
    str << "id " << ci.id << " gram " << ci.gram << "\n"; 
    return str; 
} 

コンパイラはstd::cout << count->firstに遭遇すると、その後、operator<<(std::ostream,&, ChildInfo&)が呼び出され、それが今、C++の演算子の仕事です。 (正確には、このコードはoperator<<(std::cout, count->first)に相当します)しかし、あなたのstruct ChildInfoの上記演算子には過負荷はありません。これは、基本型と標準ライブラリ型に対してのみ定義されていますが、後者の場合は、上に示したのと同じ方法でライブラリ開発者が行いました。したがって、エラーを修正するために定義します。

参照のためにOperator overloadingを参照してください。

また、は、正確なエラーメッセージを指定する習慣があります。プログラマー、またはその問題のエンジニア、でなければなりません。そうでなければ、それは動作しません。機能表示で

0

、あなたがChildInfo要素(マップのcount->first要素を、表示したいが、あなたはこのクラスの演算子< <を定義されていませんでした。

簡単な解決策は

のようなものを追加することですもちろん
ostream& operator << (ostream & os, const ChildInfo& lhs) 
{ 
    os << lhs.id; 
    return os; 
} 

、あなたが表示する内容を変更することができます。

関連する問題