0

次のコンパイラ エラーが発生しました。どうすれば修正できますか?

error:  instantiated from `_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = ar, _Tp = int, _Compare = std::less<ar>, _Alloc = std::allocator<std::pair<const ar, int> >]' 

これはコードです:

#include <map>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstdlib>

using namespace std; 

class ar { 
  public:
  int a;
  int b;
  int c;
public:
  ar() : a(0), b(0), c(0) {}
};

int main() {
   map<ar, int> mapa;
   ar k;
   k.a = 6;
   k.b = 1;
   k.c = 0;
   mapa[k] = 1;

   //system("pause");
   return 0;
 }
4

3 に答える 3

1

の比較関数が必要ですmapoperator<の2つのインスタンスを比較するを作成するかar、カスタム関数を作成して3番目のテンプレートパラメーターとして渡すことができます。

前者の例は次のとおりです。

class ar {
  ...
  bool operator<(const ar& rhs) const {
    return std::tie(a,b,c) < std::tie(rhs.a, rhs.b, rhs.c);
  }
  ...
};
于 2013-02-19T21:33:32.353 に答える
1

マップのキータイプをオーバーロードするstd::map必要がありますoperator<。これは、マップがその下にあるコンテナに要素を挿入する方法であるためです。

class ar { 
  public:
  int a;
  int b;
  int c;
  public:
  ar() : a(0), b(0), c(0) {}
  bool operator<(const ar& other) const;
  };

bool ar::operator< (const ar& other) const // note the function has to be const!!!
{
   return (other.a < a) && (other.b < b) && (other.c < c); // or some such ordering
}

オーバーロードするときoperator<は、同様の方法でオーバーロードすることをお勧めしoperator>ます。

于 2013-02-19T21:33:59.817 に答える
0

operator <キータイプで使用可能である必要があります。そうでない場合は、マップコンストラクターに比較ファンクターを提供する必要があります。

于 2013-02-19T21:35:48.933 に答える