我想比较使用不同分配器std::string
分配的 STL 字符串,例如使用自定义 STL 分配器的普通字符串。不幸的是,在这种情况下似乎通常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++ 高级接口和运算符重载?