2011-02-08 13 views
23

std :: map(int .NET 4.0)が必要です。もちろん、マップはツリーであり、文字列が私たちのために定義していない演算子<が必要です。std :: mapをstd :: mapのキーとして使用する

エラー24エラーC2676:バイナリ '<': 'constのはstd :: string' に事前に定義されたオペレータcに許容可能なタイプに、この演算子や変換を定義していません:\プログラムファイルのMicrosoftのVisual Studio \ 10.0 \ VCの\ xfunctional 125 1 FXCMMarketDataServer

\含まだから私は仕事に私のGoogle-FOOを入れて、この解決策を見つけた:

struct StringComparerForMap 
{ 
public: 
    bool operator()(const std::string x, const std::string y) 
    { 
     // Add compare logic here 
    } 
}; 

... 
std::map<std::string, CustomObject, StringComparerForMap> myMap; 

これは、しばらくの間、うまくいきました、そして今、私はバグに遭遇しています私はこれが原因だと信じています。 STLフレームワークのどこかでは、上記の定義を無視し、デフォルトのオペレータ<と思われるでしょう。

VS2010 .NET 4.0では文字列をマップのキーとして使用する方法はありますか?

私はその文字列を受け取り、それをintにハッシュする関数を書くことができると私は理解していますが、それはどこで楽しいですか?私が試してみて、私はデビッドのためにできる最善のようにこれを説明します

EDIT

。マップがcomparer構造体を使用すると、リリース時にクラッシュし、デバッグ時にデバッグアサーションに失敗します。失敗アサートがのXtreeラインである1746

式:無効なオペレータ<

|中止します| |リトライ| |無視する|比較演算子をマッピング与えるにもかかわらず、それはまだ比較のためにオペレータ<に特定のパスのデフォルト値をダウンと信じて私をリードするものである

。これを原因と私のコードの行は次のとおりです。

CustomObject o = stringObjectMap[key]; 
+7

std :: stringには、必要な演算子の適切な定義があります。 ヘッダーが含まれていますか?私はそれを含めることができなかったときに同様の問題を見たと思います。 std :: stringの前方宣言は、その名前自体がわかっていることを意味します。 – Keith

+3

.NETはstd :: mapまたはstd :: stringとは何の関係もありません –

+3

ライブラリ層の深い部分はデフォルトで '<'になっていると思いますか?もしそうだったら、それは壊れてしまい、あなたはバグレポートを提出するべきですが、おそらくあなたはデータを間違って解釈しています - 他の多くの状況でエラーが発生するでしょう。最初の上司にコンパイラが間違っていると言ったとき、彼は微笑んで言った:*時間の99%、問題はコンパイラーではなく、議長とキーボードの間にある* –

答えて

67

エラー24エラーC2676:バイナリ「<」:「constのはstd :: string」は、この演算子またはに許容型への変換を定義していません。事前に定義されたオペレータのC:\プログラムファイルは、マイクロソフトのVisual Studio 10.0 \ VCの\を\あなたは<string>を含めるのを忘れたときにVCがあなたの顔に吐き出すものだxfunctional 125 1 FXCMMarketDataServer

\含まれています。そのヘッダーはこの演算子を明確に定義します。

+1

これはちょうど私に起こった、マップを使ってこのエラーを何度も繰り返しています。私は "なぜインターネット上のすべての例が失敗するのですか?"と思った。 私は文字列のヘッダを忘れてしまいました。私はちょっとばかばかしいと感じる.... – Joseph

関連する問題