2015-05-27 68 views
0

我的代碼存在問題。我曾嘗試一切什麼我知道,我不能擺脫警戒線1.我有這樣的事情:在funcion模板類中的返回值無法擺脫「警告並非所有控制路徑都返回值」

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

所以

PARAM N - 在列表中的位置;
大小() - 列表的回報大小,
計數器 - PARAM有助於獲取到n位置
溫度 - 指針列表中向前移動
頭 - 開始列表的

我敢肯定,所有的路徑返回一個值,但我得到這個警告。在C++中是否有可能返回NULL引用或以其他方式解決此問題?

+2

如果'temp'在'counter'等於'n'之前變爲空,則沒有返回值。這正是編譯器所抱怨的。 – jaggedSpire

回答

1

閱讀您的人可以得出結論,如果您的功能沒有錯誤,該功能將永遠不會超過while聲明。因此,在while聲明之後省略return聲明可能沒有問題。您的編譯器無法推斷出這一點。因此,它預計while循環之後的語句return

您可以使用類似下面的安撫編譯:

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; 

BTW,有條件的在if陳述的邏輯不正確。取而代之的

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

應該

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

對於n是一個有效的基於0的索引,它必須小於列表的大小。

+0

不,如果陳述是正確的,因爲,如果我有名單: 頭 - > _ _ _ _ _,size()= 4. 我想添加項目只是在我使用的列表背面(例如),添加(size(),T item),因爲地方號碼5是空的,這個添加只是pushend。 – Hangoverflow

+0

@Hangoverflow,這聽起來不是實現這個類的正確方法。然而,你聽起來像你有一個處理。 –

1

while(temp)if (counter == n)是多餘的。只需while(n--) { temp = temp->next; } return temp->data(您可以在功能開始時測試範圍)

1

Dieter提出了更好的方法來構建您的函數,從而完全避免了這個問題。

在算法不可行的情況下,我會在函數的底部放一個throw std::runtime_error("Unexpected code path!")。這樣,如果有錯過的東西,你會默認警告,它會被正確報告。

相關問題