funcion中模板类中的返回值可以排除"警告并非所有控制路径都返回一个值"

时间:2015-05-27 18:06:28

标签: c++ list class templates warnings

我的代码有问题。我已经尝试了我所知道的一切,我无法摆脱警告级别1.我有这样的事情:

template <class T>
T& aghSlist<T>::at(int n) const
{
   if ( (n < 0) || (n > size()))
      throw aException(0, "Index out of range", __FILE__, __LINE__);

   node * temp = head;
   int counter = 0;

   while (temp)
   {
      if (counter == n)
         return temp->data; //here probably is the reason of warning
      temp = temp->next;
      counter ++;
   }
}

所以

参数 - 列表中的位置;
size() - 返回列表大小,
反对 - param有助于到达n位置
temp - 指向列表中向前移动的指针
head - 列表的开头

我确定所有路径都返回一个值,但我收到此警告。在c ++中是否有可能返回对NULL的引用或以其他方式解决此问题?

3 个答案:

答案 0 :(得分:1)

人类阅读你可以得出结论,如果你的函数没有错误,该函数将永远不会超过while语句。因此,可以在return语句之后省略while语句。您的编译器无法推断出这一点。因此,它需要return循环后的while语句。

您可以使用以下内容来安抚编译器:

while (temp)
{
   if (counter == n)
      return temp->data;
   temp = temp->next;
   counter ++;
}

// Code should never reach here.
// These lines are here solely to pacify the compiler
static T dummy{};
return dummy;
顺便说一下,if语句中条件的逻辑是不正确的。而不是

if ( (n < 0) || (n > size()))

应该是

if ( (n < 0) || (n >= size()))

要使n成为有效的基于0的索引,它必须小于列表的大小。

答案 1 :(得分:1)

带有while(temp)

if (counter == n)是多余的。只需while(n--) { temp = temp->next; } return temp->data(您在函数开头测试范围)

答案 2 :(得分:1)

Dieter提出了一种更好的方法来构建你的功能,完全避免了这个问题。

如果算法无法实现,我会在函数的底部放置throw std::runtime_error("Unexpected code path!")。这样,如果您遗漏了某些内容,则会将警告静音,并将正确报告。