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

时间:2012-02-21 21:55:00

标签: c++ templates

我创建了一个简单的模板。它给了我一个警告:“没有回归,在功能上返回非虚空”。

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;
}

任何人都可以就如何解决此警告提供一些建议。

3 个答案:

答案 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

  1. 你必须退回* this。
  2. 确保您避免使用

    将对象复制到自身是一种好习惯
    if(this != &r){...}
    
  3. 如果你为一个对象重载operator =,你几乎肯定也需要提供一个复制构造器。 e.g。

    Test::Test( const Test & r ){...}
    
  4. 修改

    你问过“如果我返回*这个,它实际上是什么回归” 好吧,它返回对当前对象的引用。例如。在上面的operator = overload定义中,返回类型被声明为Test&amp; (测试对象参考)。