// 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。
答案 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);
}