2013-04-18 2 views
0

Получение другой ошибки в моем классе строк. Intellisense не позволит мне использовать strcmp для сравнения объекта с самозавершающим объектом (т. Е. * This).Ошибка: начальное значение ссылки на не-const должно быть lvalue

Я попытался сделать свою собственную функцию преобразования оператора, чтобы помочь с этим, но он все еще дает мне ошибку.

Что мне нужно изменить в своем коде, чтобы сделать эту работу?

//Overloaded comparison operators 
bool &String::operator<(const String & obj) 
{ 
    return strcmp(*this, obj) < 0 ? true : false; 
} 

//Operator conversion function 
String::operator char const *() const 
{ 
    return mStr; 
} 
+1

Почему возвращает 'BOOL &' из этого, без разницы. Просто верните «bool». – Yuushi

ответ

3

Вы возвращаете ссылку на локальную переменную. Возврат по значению. Кроме того, можно упростить выражение возврата, и сделать метод const, так как сравнение двух объектов не должны изменять любой из них:

bool String::operator<(const String & obj) const { 
    return strcmp(*this, obj) < 0; 
} 

хотя я не уверен, что strcmp может иметь дело с двумя String с, что является то, что вы передают его. Judgning от вашего предыдущего вопроса, вам нужно

return strcmp(mstr, obj.mStr) < 0; 

+0

Но у него есть 'operator char const *() const', поэтому я думаю, что он может поместить его прямо в strcmp. – Detheroc

+0

@ Detheroc спасибо, я полностью пропустил это. – juanchopanza

1

Сделать const и удалить &

bool String::operator<(const String & obj) const 
              ^^^^^ 

Возвращаясь ссылки на временные объекты приводит к неопределенному поведению.

0

Сообщение об ошибке явно указывает на первый параметр strcmp(), * это Rvalue, но зЬгстр требует именующее выражение, попробуйте добавить одну фразу раньше:

String thisObj = *this; 
+0

Это просто неверно. –

+1

почему? можете ли вы рассказать больше? –

+0

'* это' не rvalue. В частности, вы знаете его адрес (который является «этим»). Rvalue является временным, созданным неявным вызовом 'String :: operator char const *() const'. –

Смежные вопросы