C++ 模板函数

C++ template functions

此 Vec 模板支持多种功能,例如将向量乘以标量以及将向量与另一个向量相加。

让我困惑的是,为什么第二个 operator* 的重载在 class 模板之外? 在 class 中声明的 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);

在模板 class 内声明的 operator* 同样可以在 class 外写成

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

它可以写在 class 里面,只有一个参数(代表 rhs),因为有隐含的 *this 参数用作运算符的 lhs。

与定义在class外的operator*不同的是运算符的lhs是模板类型。这允许在使用运算符时以任何方式提供参数。

您可以在 class 之外使用任意 lhs 和 rhs 类型定义运算符,但在 class 内仅限于改变 rhs。给定参数类型,编译器将 select 任何定义的 operator* 的最佳匹配。