претоварване на естествени променливи на 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