0

私が持っていたとします:map<map_data, int, decltype(compare)> the_map

struct map_data{
   int data1;
   int data2;
}

私は比較を次のように書いてみました:

struct
{
   bool operator()(map_data one, map_data two) const
   {
      if(one.data1 == two.data1)
         return one.data2 > two.data2;
      else
         return one.data1 < two.data1;
   }
}compare;

しかし、多くのコンパイルエラーが発生します。ここで何か間違ったことをしていますか?

4

2 に答える 2

2

私はそれが次のようでなければならないと思います:

struct compare
{
   bool operator()(map_data const& one, map_data const& two) const
   {
      if(one.data1 == two.data1)
         return one.data2 > two.data2;
      else
         return one.data1 < one.data2;
   }
};

また、必要ありませんdecltype。ファンクター クラスの名前を直接使用します。

std::map<map_data, int, compare> the_map;
//                      ^^^^^^^

ここでは、上記のコードのコンパイルの実際のを見ることができます。

于 2013-03-30T21:05:24.463 に答える
1

map_data定義の後のセミコロンを忘れました。それを修正すると、C++11 でのコンパイルが成功します。

#include <map>

using std::map;

struct map_data{
   int data1;
   int data2;
};

struct
{
   bool operator()(map_data one, map_data two) const
   {
      if(one.data1 == two.data1)
         return one.data2 > two.data2;
      else
         return one.data1 < two.data1;
   }
}compare;

int main() {
    map<map_data, int, decltype(compare)> the_map;
}

ただし、これに C++11 を要求し、本当に必要なのは型だけである場合にdecltypeオブジェクトをインスタンス化するのは少し無駄に思えます。compare

なぜ伝統的ではないのですか?

#include <map>

using std::map;

struct map_data {
   int data1;
   int data2;
};

struct map_data_comparator
{
   bool operator()(const map_data& one, const map_data& two) const
   {
      if (one.data1 == two.data1)
         return one.data2 > two.data2;
      else
         return one.data1 < two.data1;
   }
};

int main()
{
    map<map_data, int, map_data_comparator> the_map;
}

コンパレーターの引数をconst 参照にしたこともわかります。

于 2013-03-30T21:34:21.097 に答える