C++ C++;模板错误,无返回,函数中返回非void
我创建了一个简单的模板。它给了我一个警告:“不返回,在函数中返回非void”C++ C++;模板错误,无返回,函数中返回非void,c++,templates,C++,Templates,我创建了一个简单的模板。它给了我一个警告:“不返回,在函数中返回非void” 任何人都可以提供一些关于如何修复此警告的建议。正如警告正确指出的那样,您的函数没有返回任何内容,即使它承诺返回一个测试&。只需使用return*this结束函数,这是赋值运算符的常规约定。您的运算符=函数在假定返回对test类型的对象的引用时,不会返回任何内容。因此,改变这一点: test& operator=(const T & new_value) { value = new_value;
任何人都可以提供一些关于如何修复此警告的建议。正如警告正确指出的那样,您的函数没有返回任何内容,即使它承诺返回一个
测试&
。只需使用return*this结束函数代码>,这是赋值运算符的常规约定。您的运算符=
函数在假定返回对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
此代码在操作符=
方法之后返回测试类实例a
,然后在该实例上调用print()
方法,打印出值8
您的编译器告诉您的操作符=重载不正确。编写运算符=重载函数需要遵循特定格式
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 ){...}
编辑
你曾问过“如果我归还这个,它实际上会归还什么”
它返回对当前对象的引用。例如,在上面的运算符=重载定义中,返回类型声明为Test&(测试对象引用)。Uh。。还点什么?(可能是*这个)谢谢,现在可以用了。如果我还这个,它到底还回来了什么?我想你该重新开始了…@2607,你已经知道答案了。您知道这个是一个指向调用函数的对象的指针,您知道*
会导致引用它所应用的指针。您正在使用的方法是test
类的成员,因此此
将指向test
对象。此外,您知道test&
是您正在编写的函数的返回类型,它表示对test
对象的引用。因此,当您说*this
并获得对调用该方法的对象的引用时,您将获得对test
对象的引用,非常适合返回test&
的函数。
Test & Test::operator=( const Test & r )
{
if( this != &r )
{
// copy member variables and initialize here
m_MemberVar = r.m_MemberVar;
...
}
return *this;
}
if(this != &r){...}
Test::Test( const Test & r ){...}