1
// 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: 'vec2 vec2::operator*(v_float&, vec2&)' must take either zero or一个论点

如何为模板类重载 operator*(float, vec2)?注意 operator* 的参数个数必须是两个。

4

2 回答 2

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);
}

希望这可以帮助!

于 2012-05-02T00:17:16.000 回答
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);
}
于 2012-05-02T02:00:40.743 回答