Std :: map(int .NET 4.0)が欲しいのですが。もちろん、マップはツリーであり、文字列で定義されていない演算子<が必要であることはわかっています。
エラー24エラーC2676:バイナリ '<': 'const std :: string'は、この演算子または事前定義された演算子c:\ program files\Microsoft Visual Studio 10.0\vc\include\xfunctional125で受け入れ可能な型への変換を定義していません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フレームワークのどこかで、上記の定義を無視し、デフォルトでoperator <になっているように見えます。
VS2010 .NET 4.0で、マップのキーとして文字列を使用する方法はありますか?
その文字列を取得して、それをintにハッシュする関数を記述できることは理解していますが、その面白さはどこにありますか?
[〜#〜]編集[〜#〜]
デビッドのためにできる限りこれを説明しようと思います。マップが比較構造体を使用すると、リリース時にクラッシュし、デバッグでのデバッグアサーションに失敗します。失敗するアサートはxtree行1746にあります。
式:無効な演算子<
|中止| |再試行| |無視|
これが、マップに比較子を提供しているにもかかわらず、特定のパスをたどると、デフォルトで比較のためにoperator <になると私が信じる理由です。これを引き起こす私のコードの行は次のとおりです:
CustomObject o = stringObjectMap[key];
エラー24エラーC2676:バイナリ '<': 'const std :: string'は、この演算子または事前定義された演算子c:\ program files\Microsoft Visual Studio 10.0\vc\include\xfunctional125で受け入れ可能な型への変換を定義していません1 FXCMMarketDataServer
<string>
を含めるのを忘れたときに、VCがあなたの顔に唾を吐きます。そのヘッダーは、この演算子を明確に定義しています。