MFC CMapとSTL mapの使用法について

[戻る]
てんてく 2005/03/03(木) 12:18:52
お久しぶりです。
std::mapのキーとなるクラスとして
class CKey
{
  int flag1;
  int flag2;
  int flag3;
  int flag4;

  bool operator<(const CKey& src){
    if(flag1<src.flag1)
      return true;
    if(flag2<src.flag2)
      return true;
    if(flag3<src.flag3)
      return true;
    if(flag4<src.flag4)
      return true;
    return false;
  };
};
また、
bool operator< (const CKey & first, const CKey & second)
{
    return (first < second);
};

このキーにてstd::mapを使用したところ挿入時に
bool operator< (const CKey & first, const CKey & second)
のところでスタックオーバフローのエラーが出て原因がわからず困っています。
何か間違いがありましたらご教授ください。

原因を調べる時間が無かったのでMFCのCMapを使ったのですが、
このキーに対するMFCのヘルパー関数をどうやってオーバーライドしてよいかも
わからず、仕方なくこのCKeyをInt値に置き換えてキーがIntのmapで代用しています。
ヘルパー関数のオーバーライドの仕方についてご教授ください。
できればソースコードで・・。


私はまだテンプレートのコードは読めないので仕様をみて
使ってみた、というレベルです。
環境はWin2000、VC++6.0です。よろしくお願いします。

dairygoods 2005/03/03(木) 12:41:18
bool operator< (const CKey & first, const CKey & second)
{
    return (first < second);
};

この関数は、2つの CKey を比較( first < second )するときに
呼び出される関数です。

その関数の中で、 first < second とすると、無限ループとなってしまいます。

REE 2005/03/03(木) 13:15:56
解決方法としては、メンバ関数のbool operator<(const CKey& src)をpublicにした上
で、グローバル関数の方を削除すればよいでしょう。

てんてく 2005/03/03(木) 14:18:35
>dairygoodsさん
>REEさん

すばやい回答ありがとうございます。class CKeyのメンバは全部publicです、書き忘れてしま
いました。ですが、グローバルのoperator<を削除するとコンパイルエラーがでますよね?
とりあえず、
bool operator< (const CKey & first, const CKey & second)
{
//    return (first < second);
  if(first.flag1 < second.flag1)
    return true;
  ....

};

としたらうまく行きました。

てんてく 2005/03/03(木) 14:21:51
あ、あとMFCのほう知ってらしたらよろしくお願いします。

REE 2005/03/03(木) 15:40:14
>ですが、グローバルのoperator<を削除するとコンパイルエラーがでますよね?

エラーメッセージが分からないので、推測ですが、
おそらく、以下のようにconstを入れるとエラーが出なくなるでしょう。

bool operator<(const CKey& src) const{


CMapの方は、以下を参考に、必要と思われるものを実装してください。

http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/vclib/html/_mfc_collection_class_helpers.asp

てんてく 2005/03/06(日) 14:34:55
>おそらく、以下のようにconstを入れるとエラーが出なくなるでしょう。
推測どおりでした。
const入れたら出なくなりましたので、グローバルのほうは削除しました。
ありがとうございます。

CMapのほうはヘルプ見ても理解できなかったので・・・。

古いスレッドには追加発言できません。