我之前发布了a question关于如何重载字符串的问题,但是当我对unsigned long long
使用相同的公式时,它不起作用。
我尝试了typedef
,但这也无效。
typedef unsigned long long i64;
//a new class to hold extention types, and bytes.
class FileData
{
public:
//conversion operators
operator string(){return extensions_;}
operator i64() {return containsBytes_;}
string& operator= (FileData &);
i64& operator= (FileData &);
string extensions_;
i64 containsBytes_;
};
string &FileData::operator=(FileData& fd)
{
return fd.extensions_;
}
i64 &FileData::operator=(FileData& fd)
{
return fd.containsBytes_;
}
此代码中有两个错误。
第一个是第11行:
错误:无法重载仅由返回类型区分的函数
第二个是第22行,
错误:声明与“std :: string& FileData :: operator =(FileData& fd)”(在第17行声明)不兼容。
但如果我删除任何提及的字符串转换它仍然无法正常工作。
答案 0 :(得分:1)
我认为你在寻找的是这些
FileData& operator= (string&);
FileData& operator= (i64&);
FileData& FileData::operator=(string& s)
{
this->extensions_ = s;
return *this;
}
FileData& FileData::operator=(i64& l)
{
this->containsBytes_ = l;
return *this;
}
您将分配与类型转换运算符混淆。如果要为您的班级分配内容,则使用分配运算符。不要使它与字符串或长long
兼容对于字符串重载的赋值,您可以执行此操作
FileData a;
string str;
a = str; // This will set a.extensions_ to str, see above.
但不是。
str = a;
因为作业要求你的班级在左侧。
要做str = a;
,您需要重载转换运算符()。你做过的。
operator string(){return extensions_;}
那些超载
str = a; // This will set str to a.extensions_ See the difference?
答案 1 :(得分:0)
第一条错误消息
错误:无法重载仅由返回类型区分的函数
这两个函数具有相同的参数,仅在返回类型
方面有所不同string& operator= (FileData &);
i64& operator= (FileData &);
当参数不同时,C ++只能重载函数。
第二条错误消息
错误:声明与“std :: string& FileData :: operator =(FileData& fd)”(在第17行声明)不兼容。
i64 &FileData::operator=(FileData& fd)
{
return fd.containsBytes_;
}
这是对第一个错误的跟进。 C ++编译器忽略了第二个赋值运算符,因为没有不同的参数。现在,您使用上面首先声明的赋值运算符定义赋值运算符不兼容。