"错误:二进制表达式的操作数无效"来自字符串库组件内部

时间:2015-12-25 22:16:07

标签: c++ string clang

我正在尝试构建一个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 librariesalloc_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。我很困惑。对于我可能遗失的任何建议?

1 个答案:

答案 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);
}