我创建了一个简单的模板。它给了我一个警告:“没有回归,在功能上返回非虚空”。
template<typename T> struct test {
public:
test & operator=(const T & new_value) {
value = new_value;
}
operator T() const {
return value;
}
private:
T value;
};
警告指向
test & operator=(const T & new_value) {
value = new_value;
}
任何人都可以就如何解决此警告提供一些建议。
答案 0 :(得分:2)
正如警告所说,你的功能没有返回任何东西,即使它有望返回test &
。只需使用return *this;
结束函数,就像赋值运算符的惯例一样。
答案 1 :(得分:1)
当假设要返回对operator=
类型对象的引用时,test
函数不会返回任何内容。所以改变这个:
test& operator=(const T & new_value)
{
value = new_value;
}
对此:
test& operator=(const T & new_value)
{
value = new_value;
//dereference the "this" pointer to get a lvalue reference to
//the current object
return *this;
}
请注意,通过访问类的隐式this
指针(即指向正在调用方法的内存中指向实例类本身的指针)并取消引用它,您将访问类实例的左值引用。因此,如果从类方法返回左值引用,则可以将该引用传递给将引用作为参数的其他函数,和/或可以在返回的类实例上调用其他方法。这允许operator=
在函数和方法调用的“链”中使用,其中在调用operator=
方法之后,在结果修改的对象实例上调用另一个方法。例如,您可以执行以下操作:
test<int> a;
a.value = 5;
int b = (a = 6) + 5; //outputs the value 11
如果您为print()
对象创建了test
方法,则还可以执行以下操作:
test<int> a;
a.value = 7;
(a = 8).print();
此代码在test
方法之后返回a
类实例operator=
,然后在该实例上调用print()
方法,打印出值{{1} }。
答案 2 :(得分:0)
您的编译器告诉您operator = overload是不正确的。编写operator = overload函数需要遵循特定的格式。
Test & Test::operator=( const Test & r )
{
if( this != &r )
{
// copy member variables and initialize here
m_MemberVar = r.m_MemberVar;
...
}
return *this;
}
<强> NB 强>
确保您避免使用
将对象复制到自身是一种好习惯if(this != &r){...}
如果你为一个对象重载operator =,你几乎肯定也需要提供一个复制构造器。 e.g。
Test::Test( const Test & r ){...}
修改强>
你问过“如果我返回*这个,它实际上是什么回归” 好吧,它返回对当前对象的引用。例如。在上面的operator = overload定义中,返回类型被声明为Test&amp; (测试对象参考)。