Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;模板错误,无返回,函数中返回非void_C++_Templates - Fatal编程技术网

C++ C++;模板错误,无返回,函数中返回非void

C++ C++;模板错误,无返回,函数中返回非void,c++,templates,C++,Templates,我创建了一个简单的模板。它给了我一个警告:“不返回,在函数中返回非void” 任何人都可以提供一些关于如何修复此警告的建议。正如警告正确指出的那样,您的函数没有返回任何内容,即使它承诺返回一个测试&。只需使用return*this结束函数,这是赋值运算符的常规约定。您的运算符=函数在假定返回对test类型的对象的引用时,不会返回任何内容。因此,改变这一点: test& operator=(const T & new_value) { value = new_value;

我创建了一个简单的模板。它给了我一个警告:“不返回,在函数中返回非void”


任何人都可以提供一些关于如何修复此警告的建议。

正如警告正确指出的那样,您的函数没有返回任何内容,即使它承诺返回一个
测试&
。只需使用
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 ){...}