Как добавить арифметические операторы в std :: array? - PullRequest
3 голосов
/ 12 мая 2019

Я надеюсь унаследовать все методы, включая конструкторы std :: array.Я пытаюсь

template<class T, size_t N>
class Vec : public array<T, N>
{
public:
    using array<T, N>::array;

    Vec operator+(Vec const& rhs) const
    {
        Vec res;
        transform(begin(), end(), rhs.begin(), res.begin(), plus);
        return res;
    }

};

, но получил некоторые ошибки компиляции.

  1. 'begin': не найдена соответствующая перегруженная функция
  2. Я не могу сделать Vec<int, 2> v{1, 2}; как массивы stdдаже конструкторы наследуются.

Я могу что-то неправильно понять.Как решить эти ошибки.Любые лучшие идеи, чтобы добавить арифметические операторы на std :: array.Спасибо!

Ответы [ 2 ]

2 голосов
/ 12 мая 2019

Хорошо, подожди, причина сложная, но не бойся, решение простое. Читайте дальше.

array - это шаблон, поэтому члены класса array<T, N> не известны до создания экземпляра шаблона (помните, что шаблон может быть специализированным). И поскольку begin, по-видимому, не зависит от каких-либо параметров шаблона, его имя разрешается на первом этапе поиска, до создания экземпляра array<T, N>, т.е. до того, как станут известны члены array<T, N>. Вот почему вы получаете begin не найдена или похожая ошибка.

Простым решением является использование this->begin. Таким образом, begin будет разрешен при поиске второй фазы (после создания экземпляра std::array<T, N>), поскольку теперь ясно, что begin может быть членом унаследованного класса шаблона.

Кроме того, plus должно быть plus<>{} или plus{} в C ++ 17.

И рекомендация: старайтесь избегать using namespace std Почему "использование пространства имен std" считается плохой практикой?

Двухфазный поиск - требуется пояснение

0 голосов

Если вам нужно только добавить арифметические операции для std :: array, я не думаю, что вам нужно создавать класс для этой цели.Вы можете просто определить не шаблонные операторы шаблона, которые будут работать без прямого доступа к реализации std :: array.

template <typename T, size_t N>
auto operator+(const array<T, N>& ob1, const array<T, N>& ob2)->array<T, N> {
    array<T, N> res;
    for (int i = 0; i < N; ++i)
        res[i] = ob1[i] + ob2[i];
    return res; 
}

И так далее для других арифметических операций.

...