错误:非const引用的初始值必须是左值

问题描述:

对我的字符串类有另一个错误。 intellisense不会让我使用strcmp来比较一个对象与自我调用对象(即* this)。错误:非const引用的初始值必须是左值

我试着让自己的操作符转换函数来帮助这个,但它仍然给我错误。

我需要更改我的代码才能使其工作?

//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

为什么返回从这个'布尔&',它没有意义。只需返回一个“布尔”。 – Yuushi 2013-04-18 06:14:30

您正在返回对局部变量的引用。按价值回报。您还可以简化回归表达,使该方法const,因为比较两个对象不应该改变它们中的:

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

虽然我不知道 strcmp可以处理两个 String s,这就是你正在通过它。从以前的问题Judgning,你需要

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

+0

但他有一个'运算符char const *()const',所以我认为他可以直接把它放在strcmp中。 – Detheroc 2013-04-18 06:24:05

+0

@Dheheroc谢谢,我完全错过了。 – juanchopanza 2013-04-18 06:27:36

让它const并删除&

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

返回临时对象的引用会导致不确定的行为。

错误消息明确指出的strcmp()第一个参数,*这是一个右值,但STRCMP需要一个左值,尝试添加一个句子前:

String thisObj = *this; 
+0

这根本不正确。 – 2013-08-24 19:14:14

+1

为什么?你能告诉更多吗? – 2014-03-15 06:15:32

+0

'*这'不是一个右值。特别是,你知道它的地址(这是'this')。右值是由隐式调用'String :: operator char const *()const'创建的临时值。 – 2014-03-15 13:09:42