我正在尝试构建一个 vector
的 strings
,它们都使用相同的自定义分配器来分配内存。我有以下代码:
typedef alloc_adaptor<char, BloombergLP::bdlma::BufferedSequentialAllocator> mono_adaptor_char;
typedef std::basic_string<char, std::char_traits<char>, mono_adaptor_char> mono_string;
typedef alloc_adaptor<mono_string, BloombergLP::bdlma::BufferedSequentialAllocator> mono_adaptor_string;
typedef std::scoped_allocator_adaptor<mono_adaptor_string> mono_allocator;
BloombergLP::bdlma::BufferedSequentialAllocator alloc(pool, sizeof(pool));
std::vector<mono_string, mono_allocator> container(&alloc);
container.emplace_back("qwer"); // ERROR ON THIS LINE
std::cout << container[0] << std::endl;
(作为旁注,我很乐意采纳任何建议来减少这种疯狂的冗长)。
BloombergLP 命名空间中的所有内容都来自 opensource BDE libraries . alloc_adapter
是 Bloomberg 风格内存分配器的包装器,使它们与标准容器一起工作:
template <typename T, typename ALLOC>
struct alloc_adaptor {
typedef T value_type;
typedef T& reference;
typedef T const& const_reference;
ALLOC* alloc;
alloc_adaptor() : alloc(nullptr) {}
alloc_adaptor(ALLOC* allo) : alloc(allo) {}
template <typename T2>
alloc_adaptor(alloc_adaptor<T2, ALLOC> other) : alloc(other.alloc) {}
T* allocate(size_t sz) {
return (T*)alloc->allocate(sz * sizeof(T));
}
void deallocate(void* p, size_t) {
alloc->deallocate(p); }
};
当我编译代码时,出现以下错误:
/usr/include/c++/v1/string:2139:34: error: invalid operands to binary expression ('const allocator_type' (aka
'const alloc_adaptor<char, BloombergLP::bdlma::BufferedSequentialAllocator>') and 'allocator_type' (aka
'alloc_adaptor<char, BloombergLP::bdlma::BufferedSequentialAllocator>'))
if (__str.__is_long() && __a != __str.__alloc()) // copy, not move
以我的天真来看,它看起来好像在分配器从 vector 到字符串的传递过程中的某处,某些东西被/没有被声明为 const
。我对此很困惑。对我可能遗漏的内容有什么建议吗?
最佳答案
从外观上看,您的自定义分配器适配器 ( alloc_adaptor<...>
) 完全缺少相等/不等运算符。您的报价中可能没有它们,但似乎添加应该可以解决问题:
template <typename T, typename A>
bool operator== (alloc_adaptor<T, A> const& a0, alloc_adaptor<T, A> const& a1) {
return a0.alloc == a1.alloc;
}
template <typename T, typename A>
bool operator!= (alloc_adaptor<T, A> const& a0, alloc_adaptor<T, A> const& a1) {
return !(a0 == a1);
}
关于c++ - "error: invalid operands to binary expression"来自字符串库组件内部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34466886/