Я пытаюсь реализовать выровненный распределитель для использования с 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 требует этого, а другие нет?
rebind
? - person Cubbi   schedule 12.08.2014rebind
не нужен в С++ 11. - person Kerrek SB   schedule 12.08.2014