0

キーと値が両方とも構造体 (stE と stR) であるマップを作成しようとしているので、次のようなものがあります。

 struct stR{
  char* est;
  char* et;     
 };

struct stE{
      int num;
      char* form; 
      char* et; 
      map<stE,stR> s; 
}; 

しかし、新しい要素を挿入したいとき:

stE e;
e.num=1;
e.form="a";
e.et="b";

stE f;
f.num=2;
f.form="c";
f.et="d";

stR r;
r.est="e";
r.et="";

e.s.insert(make_pair(f, r));

それは私にエラーを与えます:

C:\Dev-Cpp\include\c++\3.4.2\bits\stl_function.h メンバー関数内 `bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = stEstado ]':

何が問題なのかわかりません。誰でも私を助けることができますか?前もって感謝します。

4

2 に答える 2

3

マップを使用する場合は、キーが自動的に順序付けられるため、より小さい演算子を指定するか、比較子を指定する必要があります。

bool stE::operator< (const stE &);
于 2012-05-02T12:35:27.960 に答える
3

厳密な弱い順序付け比較を提供する必要があります。これは、マップ テンプレート パラメーターとして functor のコンパレーター関数を定義operator<するか渡すことで実現できます。次のようになります。stEstd::map

template<class Key, class T, class Compare = std::less<Key>, ... > class map;

デフォルトでCompareは、 useT::operator<(const T&)に設定されていますが、ロジックを実装する独自のファンクター タイプを渡すことができます。これは、実際のクラスを変更できない場合に重要です。

マップはデフォルトで構築されたオブジェクトを挿入できる必要がstRあり、現在の構造にはデフォルトのコンストラクターがないことに注意してください。ポインターはランダムな値に初期化されます。これは、さらに先の問題になる可能性があります。

また、キー構造体には、独自のキー タイプであるマップがあります。これにより、小なり比較を実装しようとすると、再帰の問題が発生する可能性があります。

struct stE{
  int num;
  char* form; 
  char* et; 
  map<stE,stR> s; // how do we use this in the comparison?
}; 
于 2012-05-02T12:37:58.407 に答える