下面是我的C ++代码片段,它涉及复制赋值运算符:
StudentRecord & operator=(const StudentRecord & rhs) {
if (this != &rhs ){
StudentRecord::name = rhs.name;
StudentRecord:: surname = rhs.surname;
StudentRecord::studentNumber=rhs.studentNumber;
StudentRecord::classRecord = rhs.classRecord;
int newToken= StudentRecord::aquire_token();
if(StudentRecord::token != -1){
//Error here
StudentRecord::release_token( StudentRecord::token );
}
}
return (*this);
}
下面是.h头文件中成员函数的声明:
StudentRecord operator=(const StudentRecord & rhs);
但是我在Linux上使用Eclipse时收到以下错误消息:
Invalid arguments 'Candidates are:void release_token(int)'
这是我应该关注的事情,因为根据我的经验,Eclipse在用作C ++开发的ide时容易出错。这是一个真正的问题,为什么发生错误以及修复错误需要什么步骤
我真的需要知道。
#ifndef _STUDENT_H
#define _STUDENT_H
#include <string>
namespace dnkmat001 {
class StudentRecord
{
public:
std::string name;
std::string surname;
std::string studentNumber;
std::string classRecord;
int token;
public:
StudentRecord(const std::string& n , const std::string& s , const std::string& x , const std::string& c );
StudentRecord(void);
StudentRecord(const StudentRecord & rhs);
StudentRecord(StudentRecord && rhs );
StudentRecord operator=(const StudentRecord & rhs);
StudentRecord operator=(const StudentRecord && rhs);
~StudentRecord();
int avg(void);
static int aquire_token();
void release_token(int t);
};
}
#endif
这是release_token(int)的声明:
void release_token(int t);
答案 0 :(得分:1)
您在类定义中声明赋值运算符是:
StudentRecord operator=(const StudentRecord & rhs);
然后你写
StudentRecord & operator=(const StudentRecord & rhs) {
//...
}
但这不是你在课堂上声明的函数的定义。它是一个免费的函数,它也可以立即清楚,如果你没有用它的类名限定每个变量,编译器会抱怨。您需要通过明确限定它来告诉编译器您正在定义先前在StudentRecord类中声明的函数。另请注意,您的函数声明为返回StudentRecord
,但它应返回StudentRecord &
。
更改函数定义的签名,如下所示:
StudentRecord & StudentRecord::operator=(const StudentRecord & rhs) {
//...
}
为了便于阅读,还要删除函数体内的所有StudentRecord::
限定符。