C ++一元 - 运算符重载将无法编译

时间:2010-04-27 13:38:30

标签: c++ operator-overloading

我正在尝试创建一个重载的一元运算符,但无法获取要编译的代码。代码的简化版本如下: -

class frag
{
    public:

        frag myfunc  (frag oper1,
                      frag oper2);
        frag myfunc2  (frag oper1,
                      frag oper2);

        friend frag operator + (frag &oper1,
                                frag &oper2);

        frag operator - ()
        {
            frag f;
            f.element = -element;
            return f;
        }

    private:

        int element;

};

frag myfunc (frag oper1, frag oper2)
{
    return oper1 + -oper2;
}

frag myfunc2 (frag oper1, frag oper2)
{
    return oper1 + oper2;
}

frag operator+ (frag &oper1, frag &oper2)
{
    frag innerfrag;
    innerfrag.element = oper1.element + oper2.element;
    return innerfrag;
}

编译器报告......

/home/brian/Desktop/frag.hpp: In function ‘frag myfunc(frag, frag)’:
/home/brian/Desktop/frag.hpp:41: error: no match for ‘operator+’ in ‘oper1 + oper2.frag::operator-()’
/home/brian/Desktop/frag.hpp:16: note: candidates are: frag operator+(frag&, frag&)

有人可以建议我在这里做什么吗?

4 个答案:

答案 0 :(得分:7)

<强>常量-正确性

这必须是

 frag operator+ (const frag &oper1, const frag &oper2);

或者操作数不能是临时值,例如operator-的返回值

一元减去应该是:

frag operator - () const;

因为它不应该修改操作数。

答案 1 :(得分:3)

您没有operator+可以对临时对象进行操作。 Temporaries不能作为非const引用传递。

operator+的签名更改为:

frag operator + (const frag &oper1, const frag &oper2);

答案 2 :(得分:1)

虽然您的问题已经得到了相当好的回答,但我认为值得一提的是关于您的代码的另一点。现在,您有以下声明:

class frag
{
    public:

        frag myfunc  (frag oper1,
                      frag oper2);
        frag myfunc2  (frag oper1,
                      frag oper2);

...你有以下功能:

frag myfunc (frag oper1, frag oper2)
{
    return oper1 + -oper2;
}

frag myfunc2 (frag oper1, frag oper2)
{
    return oper1 + oper2;
}

我猜你想要这两个函数来实现你在frag中声明的成员函数 - 但它们没有。相反,您有两个由从未定义的成员函数,这两个函数碰巧具有相似的名称。要让他们成为您声明的成员函数,您需要将声明更改为:

frag frag::myfunc(frag oper1, frag oper2) { 
    return oper1 + -oper2;
}

frag frag::myfunc2(frag oper1, frag oper2) { 
    return oper1 + oper2;
}

另一方面,这些也没有任何意义 - 特别是作为成员函数,它们通常被调用为:a.myfunc(b,c);它们都真的写得像但是全局函数 - 作为成员函数,它们通常只接受一个参数,并使用this作为第一个参数:

frag frag::myfunc1(frag oper) { 
    return *this + -oper;
}
frag frag::myfunc2(frag oper) { 
    return *this + oper;
}

当然,这可能只是因为尝试将原始代码减少到发布所需的最小值而产生的偶然副作用。如果是这样,请随意忽略这整个“答案”....

答案 3 :(得分:0)

已经给出了答案(const参数),但我想提一下,Visual C ++ 9(VS-2008)确实会在没有警告的情况下编译上面的内容。