代码之家  ›  专栏  ›  技术社区  ›  Brian Hooper

C++一元运算符重载不会编译。

  •  4
  • Brian Hooper  · 技术社区  · 15 年前

    我试图创建一个重载的一元运算符,但无法编译代码。代码的缩减版本如下:

    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 回复  |  直到 14 年前
        1
  •  7
  •   UncleBens    15 年前

    常数正确性

    这一定是

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

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

    一元减应该是:

    frag operator - () const;
    

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

        2
  •  3
  •   JoeG    15 年前

    你没有 operator+ 这可以在临时情况下操作。临时参数不能作为非常量引用传递。

    更改您的签名 操作员+ 到:

    frag operator + (const frag &oper1, const frag &oper2);
    
        3
  •  1
  •   Jerry Coffin    15 年前

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

    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 --但是它们没有。相反,您有两个成员函数,它们由never defined声明,而这两个是恰好具有相似名称的全局函数。让他们 您声明的成员函数,需要将声明更改为如下内容:

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

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

        4
  •  0
  •   Lightness Races in Orbit    14 年前

    已经给出了答案(const参数),但我想提到的是Visual C++(9)确实会毫无疑问地编译上面的代码。