нет преобразования из std::allocator в const allocator_type

Я пытаюсь реализовать выровненный распределитель для использования с MKL в С++ 11. У меня есть:

template <typename T, size_t TALIGN = 16, size_t TBLOCK = 4>
class aligned_allocator : public std::allocator<T>
{
    typedef typename std::allocator<T>::pointer pointer;
    typedef typename std::allocator<T>::size_type size_type;
public:
    pointer allocate(size_type n, const void *hint = nullptr);
    void deallocate(pointer p, size_type n);
};

В другом месте у меня есть:

template<typename T> using aligned_vector = std::vector<T, aligned_allocator<T>>;

и, наконец, у меня есть эта перегрузка оператора:

inline aligned_vector<double> operator+(aligned_vector<double> x, aligned_vector<double> y)
{
    aligned_vector<double> z(x.size());
    vdAdd(x.size(), x.data(), y.data(), z.data());
    return z;
}

Все это компилируется и прекрасно работает как под icc, так и под clang, но с GCC 4.9 оно не скомпилируется, пока я не сделаю обе константные ссылки x и y. Почему GCC требует этого, а другие нет?


person Alex Reinking    schedule 11.08.2014    source источник
comment
Где твой rebind?   -  person Cubbi    schedule 12.08.2014
comment
@Cubbi: rebind не нужен в С++ 11.   -  person Kerrek SB    schedule 12.08.2014


Ответы (1)


Вам не хватает rebind:

template <typename U> struct rebind { typedef aligned_allocator<U> other; };

Тем не менее, вы не должны наследовать от std::allocator: Почему бы не наследовать от std::allocator

person ecatmur    schedule 11.08.2014
comment
Ничего себе, это было быстро - и решение! Спасибо! - person Alex Reinking; 12.08.2014
comment
Но почему это работает в clang и icc, но не в gcc? (это был мой вопрос) - person Alex Reinking; 12.08.2014
comment
@AlexReinking clang 3.4.1 и icc 13.0.1 требуют rebind для меня: goo.gl/Cgu1oF - person ecatmur; 12.08.2014
comment
Эх, похоже icc 14.0.3 не для меня. - person Alex Reinking; 12.08.2014
comment
@AlexReinking: libstdc++ GCC далек от совместимости с C++11. Большинство контейнеров не реализуют контейнеры с точки зрения требований распределителя C++11. - person Kerrek SB; 12.08.2014