-1

我之前发布了一个关于如何重载字符串的问题,但是当我使用相同的公式时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 行声明)。

但如果我删除任何提及字符串转换的内容,它仍然不起作用。

4

2 回答 2

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;
}

您将赋值与类型转换运算符混淆了。当你想给你的类分配一些东西时,使用赋值运算符。不使其与 string 或 long 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? 
于 2013-04-07T22:33:49.633 回答
0

第一条错误消息

错误:不能重载仅由返回类型区分的函数

这两个函数具有相同的参数,仅在返回类型上有所不同

string& operator= (FileData &);
i64& operator= (FileData &);

只有当函数的参数不同时,C++ 才能重载函数。

第二条错误信息

错误:声明与“std::string &FileData::operator=(FileData& fd)”不兼容(在第 17 行声明)。

i64 &FileData::operator=(FileData& fd)
{
    return fd.containsBytes_;
}

This is a follow up to the first error. The C++ compiler ignored the second assignment operator, because there was no differing parameters. Now, you define an assignment operator, which is incompatible with the assignment operator declared first above.

于 2013-04-07T22:37:17.957 回答