お久しぶりです。
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です。よろしくお願いします。
bool operator< (const CKey & first, const CKey & second)
{
return (first < second);
};
この関数は、2つの CKey を比較( first < second )するときに
呼び出される関数です。
その関数の中で、 first < second とすると、無限ループとなってしまいます。
解決方法としては、メンバ関数のbool operator<(const CKey& src)をpublicにした上
で、グローバル関数の方を削除すればよいでしょう。
>dairygoodsさん
>REEさん
すばやい回答ありがとうございます。class CKeyのメンバは全部publicです、書き忘れてしま
いました。ですが、グローバルのoperator<を削除するとコンパイルエラーがでますよね?
とりあえず、
bool operator< (const CKey & first, const CKey & second)
{
// return (first < second);
if(first.flag1 < second.flag1)
return true;
....
};
としたらうまく行きました。
あ、あとMFCのほう知ってらしたらよろしくお願いします。
>ですが、グローバルの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
>おそらく、以下のようにconstを入れるとエラーが出なくなるでしょう。
推測どおりでした。
const入れたら出なくなりましたので、グローバルのほうは削除しました。
ありがとうございます。
CMapのほうはヘルプ見ても理解できなかったので・・・。