【问题标题】:error: void value not ignored as it ought to be错误:应忽略的无效值
【发布时间】:2011-11-10 14:12:21
【问题描述】:
template <typename Z> Z myTemplate <Z> :: popFromVector ()
{
    if (myVector.empty () == false)
        return myVector.pop_back ();

    return 0;
}

int main ()
{
    myTemplate <int> obj;

    std :: cout << obj.popFromVector();

    return 0;
}

错误:

error: void value not ignored as it ought to be

AFAI 可以看到,popFromVector 的返回类型不是 void。我错过了什么? 当我在 main() 中注释掉这个调用时,错误消失了。

【问题讨论】:

  • 你确定这是来自编译器的错误信息吗?你用的是什么编译器?
  • std::vector&lt;&gt;::pop_back 的返回值却是void。你想要像{Z x=myVector.back(); myVector.pop_back(); return x; } 这样的东西。
  • 什么是myVector?哪里出错了?
  • @user786653 这很有帮助,谢谢。如果您将其发布为答案,我会接受。
  • @user786653 现在你还没有回复...

标签: c++ vector


【解决方案1】:

std::vector&lt;T&gt;::pop_back() 返回无效。您尝试将其作为 int 返回。这是不允许的。

【讨论】:

  • 如果我们知道 OP 在内部使用 std::vector,那就是答案......
  • @DeadMG 啊,我从来没有注意到这一点。非常感谢。
  • 您愿意解释一下吗?您的回复对不知道如何解决问题的人毫无用处。我的意思是不要冒犯只有帮助。我不知道如何很好地使用模板。事实上,我刚刚了解了他们。请根据你的三句话来构建。
  • @dylnmc:这个答案非常清楚。一般来说,没有办法告诉你“如何解决问题”,因为这取决于你想要做什么以及你想如何设计你的程序。需要独立思考;我们不能为您做一切
【解决方案2】:

那是因为std::vector::pop_back 的定义有一个void 返回类型...您正试图从该方法返回一些东西,但由于该方法不返回任何东西,所以这是行不通的。

将您的函数更改为以下内容,以便您可以返回那里的内容,并删除向量的背面:

template <typename Z> Z myTemplate <Z> :: popFromVector ()
{
    //create a default Z-type object ... this should be a value you can easily
    //recognize as a default null-type, such as 0, etc. depending on the type
    Z temp = Z(); 

    if (myVector.empty () == false)
    {
        temp = myVector.back();
        myVector.pop_back();
        return temp;
    }

    //don't return 0 since you can end-up with a template that 
    //has a non-integral type that won't work for the template return type
    return temp; 
}

【讨论】:

    【解决方案3】:

    这是pop_back()。它有一个 void 返回类型。您必须使用 back() 来获取实际值。这是为了避免不必要的复制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-02
      相关资源
      最近更新 更多