二进制“+=”:未找到采用类型 'Add' C++ 的全局运算符
Binary '+=' : no global operator found which takes type 'Add' C++
我真的被运算符重载绊倒了。我这里有一个用于加法 (+) 的简单操作重载,但它没有在我的 class.
中找到全局运算符
谁能解释一下为什么会这样,我该如何解决?
错误信息:
1>------ Build started: Project: exercise 2, Configuration: Debug Win32 ------
1>Compiling...
1>Add.cpp 1>c:\documents and settings\...\exercise 2\add.cpp(15) :
error C2677: binary '+=' : no global operator found which takes type 'Add' (or there is no acceptable conversion)
1>Build log was saved at "file://c:\Documents and Settings\...\Debug\BuildLog.htm"
1>exercise 2 - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Add.h:
#ifndef ADD_H
#define ADD
class Add{
public:
Add(int = 0); //default constructor
Add(Add &); //copy constructor
~Add(); //destructor
Add operator+(Add &);
private:
int num;
};
#endif
Add.cpp:
#include "stdafx.h"
#include <conio.h>
#include <iostream>
using namespace std;
#include "Add.h"
Add::Add(int x){
num = x;
}
Add Add::operator +(Add &y){
Add x = *this;
x.num += y;
return x;
}
非常感谢!
您正在尝试将 Add
添加到 int
。将 x.num += y
更改为 x.num += y.num
。
此外,operator+
通常最好作为独立的对称函数实现。
当您为 class 重载 +
运算符时,+=
运算符不会自动重载,例如在 C# 中。你必须自己定义它。 -=
等也是如此
您需要将 +=
运算符定义为成员函数,并且 return 对被操作实例的引用:
Add& Add::operator += (const Add& rhs) {
num += rhs.num;
return *this;
}
您的 +
运算符应该是非成员,并且 return 一个表示操作结果的新实例:
Add operator + (const Add& lhs, const Add& rhs) {
return Add(lhs.num + rhs.num);
}
此外,在 Add.h
中:
#ifndef ADD_H
#define ADD // should be ADD_H
// in Add:
Add(Add &); // should use 'const Add&'
此外,您不需要定义自己的 copy constructor
和 destructor
,如果它们没有做任何特别的事情。就像 class Add
的情况一样,您可以忽略它们,让编译器为您生成它们。
我真的被运算符重载绊倒了。我这里有一个用于加法 (+) 的简单操作重载,但它没有在我的 class.
中找到全局运算符谁能解释一下为什么会这样,我该如何解决?
错误信息:
1>------ Build started: Project: exercise 2, Configuration: Debug Win32 ------
1>Compiling...
1>Add.cpp 1>c:\documents and settings\...\exercise 2\add.cpp(15) :
error C2677: binary '+=' : no global operator found which takes type 'Add' (or there is no acceptable conversion)
1>Build log was saved at "file://c:\Documents and Settings\...\Debug\BuildLog.htm"
1>exercise 2 - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Add.h:
#ifndef ADD_H
#define ADD
class Add{
public:
Add(int = 0); //default constructor
Add(Add &); //copy constructor
~Add(); //destructor
Add operator+(Add &);
private:
int num;
};
#endif
Add.cpp:
#include "stdafx.h"
#include <conio.h>
#include <iostream>
using namespace std;
#include "Add.h"
Add::Add(int x){
num = x;
}
Add Add::operator +(Add &y){
Add x = *this;
x.num += y;
return x;
}
非常感谢!
您正在尝试将 Add
添加到 int
。将 x.num += y
更改为 x.num += y.num
。
此外,operator+
通常最好作为独立的对称函数实现。
当您为 class 重载 +
运算符时,+=
运算符不会自动重载,例如在 C# 中。你必须自己定义它。 -=
等也是如此
您需要将 +=
运算符定义为成员函数,并且 return 对被操作实例的引用:
Add& Add::operator += (const Add& rhs) {
num += rhs.num;
return *this;
}
您的 +
运算符应该是非成员,并且 return 一个表示操作结果的新实例:
Add operator + (const Add& lhs, const Add& rhs) {
return Add(lhs.num + rhs.num);
}
此外,在 Add.h
中:
#ifndef ADD_H
#define ADD // should be ADD_H
// in Add:
Add(Add &); // should use 'const Add&'
此外,您不需要定义自己的 copy constructor
和 destructor
,如果它们没有做任何特别的事情。就像 class Add
的情况一样,您可以忽略它们,让编译器为您生成它们。