c++ - "error: invalid operands to binary expression"来自字符串库组件内部

标签 c++ string clang

我正在尝试构建一个 vectorstrings,它们都使用相同的自定义分配器来分配内存。我有以下代码:

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/

相关文章:

c++ - 使用 libtooling 获取完全限定的模板模板参数名称

c++ - 为什么在这个递归斐波那契代码中 GCC 生成的程序比 Clang 更快?

c++ - 为什么可变参数类模板最多只能有一个参数包?

c++ - 相当于 glBegin/glEnd 的现代 OpenGL 是什么

java - 替换特定模式中的字符或特定字符之后的字符

javascript - 搜索字符串中括号之间的内容

c++ - g++ 和 clang++ 推断函数模板返回类型的不同行为

c++ - 在 C++ 抽象类中将回调(对于 C 库)实现为纯虚函数

mysql - 在 MySQL 中使用字符串枚举 - 性能问题

c++ - Clang++ 非静态数据成员初始化错误? C++11