Я хотел бы сравнить строки STL, которые выделяются разными распределителями, например. обычный std::string
со строкой с использованием специализированного распределителя STL. К сожалению, кажется, что обычный operator==()
не работает в этом случае:
// Custom STL allocator to allocate char 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==()
) не зависит от того, каким образом строка выделяет его память.
Что-то мне здесь не хватает? Возможно ли в этом случае поддерживать высокоуровневый интерфейс С++ и перегрузку оператора?