перегружать собственные переменные C++

Ранее я разместил вопрос о том, как перегружать строки, но когда я использую та же формула для 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).

но если я удалю любое упоминание о преобразовании строк, оно все равно не сработает.


person Protonblast    schedule 07.04.2013    source источник
comment
Какой у Вас вопрос?   -  person Daniel Frey    schedule 08.04.2013
comment
Первое сообщение об ошибке точно говорит, что это за ошибка. Второй — просто следствие. Проблема не связана с неявными операторами преобразования.   -  person Konrad Rudolph    schedule 08.04.2013
comment
Гррр. Не вставляйте код с нумерацией строк, пожалуйста. Отметьте оскорбительные кодовые точки комментариями. Никто не хочет копировать ваш код, вставлять его в свою установку, а затем тратить время на удаление всего лишнего.   -  person WhozCraig    schedule 08.04.2013
comment
@WhozCraig :%s/^\s*\d*|// — но я согласен.   -  person Konrad Rudolph    schedule 08.04.2013
comment
пожалуйста, предоставьте ссылку на ваш предыдущий вопрос и укажите, что он все еще не работает.   -  person didierc    schedule 08.04.2013
comment
@didierc Его предыдущий вопрос здесь: stackoverflow.com/questions/15867531/   -  person JBentley    schedule 08.04.2013
comment
stackoverflow.com/questions/15867531/ это здесь, я имею в виду, что преобразование строк работает, но теперь я не уверен, как исправить преобразование для unsigned long long   -  person Protonblast    schedule 08.04.2013
comment
Просто удалите оба оператора, они вам не нужны или не нужны.   -  person Konrad Rudolph    schedule 08.04.2013
comment
Проблемный код — это перегрузка operator =, а не операторов преобразования.   -  person didierc    schedule 08.04.2013


Ответы (2)


Я думаю, что вы ищете это

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

Вы путаете присваивание с операторами преобразования типов. Оператор присваивания используется, когда вы хотите присвоить что-то вашему классу. Не делать его совместимым со строкой или длинным длинным

С назначением для перегруженной строки вы можете сделать это

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? 
person Community    schedule 07.04.2013

Первое сообщение об ошибке

Ошибка: нельзя перегружать функции, отличающиеся только типом возвращаемого значения.

Эти две функции имеют одинаковые параметры и отличаются только типами возвращаемых значений.

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

C++ может перегружать функции только тогда, когда они отличаются параметрами.

Второе сообщение об ошибке

Ошибка: объявление несовместимо с "std::string &FileData::operator=(FileData& fd)" (объявлено в строке 17).

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

Это продолжение первой ошибки. Компилятор C++ проигнорировал второй оператор присваивания, потому что в нем не было отличающихся параметров. Теперь вы определяете оператор присваивания, который несовместим с оператором присваивания, объявленным первым выше.

person Olaf Dietsche    schedule 07.04.2013