我正在尝试构建一个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
对于我的天真,它看起来好像在从向量到字符串的分配器的交接中的某个地方,某些东西被声明为const
。我很困惑。对于我可能遗失的任何建议?
答案 0 :(得分:2)
从它的外观来看,你的自定义分配器适配器(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);
}