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

4

我试图创建一个重载的一元运算符-,但无法使代码编译。以下是代码的简化版本:

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&)

有人能建议我在这里需要做什么吗?

这段内容与IT技术无关,请提供更具体的信息。
4个回答

7

常量正确性

这必须是

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

否则,操作数不能是临时变量,例如operator-的返回值。
一元减号应该改为:
frag operator - () const;

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


3

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

请将operator+的签名更改为:

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

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

当然,这可能只是为了尝试将原始代码最小化以进行发布而产生的意外副作用。如果是这样,请随意忽略这个“答案”...。

1
我认为你说得对,这可能是因为我创建了一个最小的犯罪者,这在我的实质性版本中并没有出现,但还是谢谢你提到它。 - Brian Hooper

0

答案已经给出(const参数),但我想提一下,Visual C++ 9(VS-2008)确实可以编译上述代码而不会警告。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接