重载C ++本机变量

时间:2013-04-07 22:05:22

标签: c++ types overloading native

我之前发布了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行声明)不兼容。

但如果我删除任何提及的字符串转换它仍然无法正常工作。

2 个答案:

答案 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 ++编译器忽略了第二个赋值运算符,因为没有不同的参数。现在,您使用上面首先声明的赋值运算符定义赋值运算符不兼容