重载模板运算符*

时间:2012-05-02 00:13:11

标签: c++ templates operator-overloading

// vec2.h
template<class v_float=float>
class vec2
{
public:
    v_float m[2];
};

template<class v_float>
vec2<v_float> operator* (v_float & f, vec2<v_float> & v);

template<class v_float>
vec2<v_float> vec2<v_float>::operator* (v_float & f, vec2 & v)
{
    return vec2(v.m[0]*f, v.m[1]*f);
}

我想为上面的模板类vec2重载operator *,但上面的代码给了我以下错误:vec2.cpp:68:error:&#39; vec2 vec2 :: operator *(v_float&amp;,vec2&amp; ;)&#39;必须采取零或一个参数

如何为模板类重载运算符*(float,vec2)?请注意,operator *的参数数量必须为2。

2 个答案:

答案 0 :(得分:2)

我认为问题出在这个模板成员函数中:

template<class v_float>
    vec2<v_float> vec2<v_float>::operator* (v_float & f, vec2 & v)
{
    return vec2(v.m[0]*f, v.m[1]*f);
}

由于您在此处将operator *定义为成员函数,因此C ++会自动假定接收器对象是操作数之一。这意味着如果你想定义乘法,你应该只定义一个带有一个参数的函数,即乘法的右边(因为左边是接收器对象)。

我认为你的意思是把它作为一个自由函数,如下所示:

template<class v_float>
    vec2<v_float> operator* (v_float & f, vec2<v_float> & v)
{
    return vec2(v.m[0]*f, v.m[1]*f);
}

希望这有帮助!

答案 1 :(得分:0)

您使用了未使用成员函数声明和重载*的构造函数以及非成员函数。最佳做法通常是使用非会员朋友功能。

这样的事情:

template<typename v_float=float>
class vec2
{
    v_float m[2];

public:
    vec2(const v_float &f1, const v_float &f2) { m[0] = f1; m[1] = f2; }

    template<typename T, typename Y>
    friend vec2<Y> operator*(T f, const vec2<Y> & v);
};

template <typename T, typename v_float>
vec2<v_float> operator*(T f, const vec2<v_float> & v)
{
    return vec2<v_float>(v.m[0]*f, v.m[1]*f);
}