異なるアロケータで割り当てられた STL 文字列を比較したいと思います。たとえば、通常の文字列とカスタム STL アロケータstd::string
を使用した文字列を比較したいと思います。残念ながら、この場合、通常は機能しないようです。operator==()
// Custom STL allocator to allocate char's for string class
typedef MyAllocator<char> MyCharAllocator;
// Define an instance of this allocator
MyCharAllocator myAlloc;
// An STL string with custom allocator
typedef std::basic_string
<
char,
std::char_traits<char>,
MyCharAllocator
>
CustomAllocString;
std::string s1("Hello");
CustomAllocString s2("Hello", myAlloc);
if (s1 == s2) // <--- ERROR: doesn't compile
...
特に、MSVC10 (VS2010 SP1) は次のエラー メッセージを出力します。
エラー C2678: バイナリ '==' : 型 'std::string' の左側のオペランドを取る演算子が見つかりません (または、受け入れ可能な変換がありません)
したがって、次のような低レベルの(読みにくい) コードは次のようになります。
if (strcmp(s1.c_str(), s2.c_str()) == 0)
...
使用すべきです。
(これは、通常の単純な構文を使用できないstd::vector
、異なる方法で割り当てられた文字列がある場合などに特に厄介です。)v[i] == w[j]
カスタム アロケータは文字列メモリが要求される方法を変更するため、これはあまり良くないように思えますが、文字列クラスのインターフェイス( との比較を含むoperator==()
) は、文字列がそのメモリを割り当てる特定の方法から独立しています。
私がここに欠けているものはありますか?この場合、C++ の高レベル インターフェイスと演算子のオーバーロードを維持することは可能ですか?