【问题标题】:Overloading template operator*重载模板运算符*
【发布时间】:2012-05-02 00:13:11
【问题描述】:
// 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零个或一个参数

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

【问题讨论】:

  • 算子作为成员函数实现时,参数的个数减少1个。

标签: c++ templates operator-overloading


【解决方案1】:

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

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

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    您使用了一个未声明的构造函数,并通过一个成员函数和一个非成员函数重载了 *。最佳做法通常是使用非会员好友功能。

    类似这样的:

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

    【讨论】:

      猜你喜欢
      • 2015-09-15
      • 1970-01-01
      • 2022-10-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      • 2016-02-03
      • 2018-08-03
      • 2013-02-05
      相关资源
      最近更新 更多