运算符重载:简单加法...错误C2677:二进制'+':找不到带有___类型的全局运算符(或者没有可接受的转换)

时间:2014-03-01 22:10:00

标签: c++ operator-overloading

这是我的标题:

//RINT.h
#ifndef _RINT_H_
#define _RINT_H_

#include <iostream>

class RINT
{
    public:
        RINT();
        RINT(int);
        RINT(int, int);
        RINT operator+(RINT);
        RINT operator+(int);
        RINT operator+();
        friend std::ostream &operator<<(std::ostream &, const RINT &);
        friend std::istream &operator>>(std::istream &, RINT &);
    private:
        int a, b;
};

#endif

定义:

//RINT.cpp
#include <iostream>
using namespace std;

#include "RINT_stack.h"

RINT::RINT()
{
    a = b = 0;
}

RINT::RINT(int x)
{
    a = x;
    b = 0;
}

RINT::RINT(int x, int y)
{
    a = x;
    b = y;
}

RINT RINT::operator+(RINT x)
{
    a += x.a;
    b += x.b;
    return RINT(a,b);
}

RINT RINT::operator+(int x)
{
    a += x;
    return RINT(a,b);
}

RINT RINT::operator+()
{
    return RINT(a,b);
}

ostream &operator<<(ostream &o, const RINT &x)
{
    o << x.a;
    o << x.b;
    return o;
}

istream &operator>>(istream &i, RINT &x)
{
    i >> x.a;
    i >> x.b;
    return i;
}

最后,测试代码:

//RINT_test.cpp
#include "stdafx.h"
#include "RINT_stack.h"

#include <iostream>
using std::cin;
using std::cout;
using std::endl;

int main()
{
    RINT x, y = 4;
    int a = 5, b = 2;
    RINT z = y;

    x = 5;
    y = 6;
    z = x + y;
    z = x + 10;
    z = 1 + x; //error here!
    x = 1;
    x = +x;

    return 0;
}

我在第20行的'z = 1 + x'的RINT_test.cpp中收到以下错误:

错误C2677:二进制'+':找不到采用'RINT'类型的全局运算符(或者没有可接受的转换)

我知道错误是因为运算符前面有一个整数,但我不知道如何从这里开始。任何帮助或方向表示赞赏。谢谢!

2 个答案:

答案 0 :(得分:1)

RINT RINT::operator+(RINT x)
{
    a += x.a;
    b += x.b;
    return RINT(a,b);
}

这不是const,修改你调用它的对象,因此不能在临时调用。因此,如果您希望z = 1 + xRINT创建一个临时1,然后在其上调用operator+,则不能。{/ p>

你想:

RINT RINT::operator+(RINT const& x) const
{
    return RINT(a + x.a, b + x.b);
}

您在其他运营商中也有类似的错误。像+这样的运营商应修改您调用它们的对象。像c = a + b;这样的代码不应更改ab的值。只有像+=这样的运营商才能这样做。

答案 1 :(得分:0)

  

我知道错误是因为运算符前面有一个整数,但我不知道如何从这里开始。

是的,编译器是对的!您 缺少 全球

RDINT operator+(const int&, const RDINT&);

int operator+(const int&, const RDINT&);

声明/定义!

您可能会注意到,上面的函数签名样本的第一个参数与您提到的代码示例中的前面整数相匹配。