Шаблонные функции C++

Этот шаблон Vec поддерживает несколько функций, таких как умножение вектора на скаляр и добавление вектора к другому вектору.

Меня смущает то, что перегрузка второго operator* находится за пределами шаблона класса? operator* который объявлен в классе перегрузок vectorXscalar Тот, который объявлен снаружи, поддерживает scalarXvector

template <class T>
class Vec {
public:
    typename list<T>::const_iterator begin() const {
        return vals_.begin();
    }
    typename list<T>::const_iterator end() const {
        return vals_.end();
    }
    Vec() {};

    Vec(const T& el);
    void push_back(T el);
    unsigned int size() const;
    Vec operator+(const Vec& rhs) const;
    Vec operator*(const T& rhs) const; //here
    T& operator[](unsigned int ind);
    const T& operator[](unsigned int ind) const;
    Vec operator,(const Vec& rhs) const;
    Vec operator[](const Vec<unsigned int>& ind) const;

    template <class Compare>
    void sort(Compare comp) {
        vals_.sort(comp);
    }

protected:
    list<T> vals_; 
};

template <class T>
Vec<T> operator*(const T& lhs, const Vec<T>& rhs); //and here!

template <class T>
ostream& operator<<(ostream& ro, const Vec<T>& v);

1 ответ

Решение

operator* объявленный внутри класса шаблона, в равной степени может быть записан вне класса как

template <class T>
Vec<T> operator*(const Vec<T>& lhs, const T& rhs);

Он может быть записан внутри класса с одним аргументом (представляющим rhs), потому что подразумевается *this Аргумент используется в качестве lhs оператора.

Разница с operator* вне класса определено, что lhs оператора является типом шаблона. Это позволяет указывать аргументы в любом случае при использовании оператора.

Вам разрешается определять оператор вне класса с любыми произвольными типами lhs и rhs, но внутри класса ограничиваются только изменением rhs. Компилятор выберет лучшее совпадение из любого определенного operator* учитывая типы аргументов.

Другие вопросы по тегам