2013-04-21 241 views
0

我的函數get_num返回變量long int錯誤:無法從'long'轉換爲'int'

我想寫的下一個操作員:

long int& operator [] (long int i) { 
    long int a = get_num(i); 
    int& b = a; 
    return b; 
} 

,但我得到了一個錯誤:

error C2440: 'initializing' : cannot convert from 'long' to 'int &' 
error C2440: 'return' : cannot convert from 'int' to 'long &' 

我怎麼能解決這個問題不改變的get_num的功能?

任何幫助讚賞!


我有一個類:

class B { 
    B* next; 
    long int nom; 
    long int denom; 
    public: 
    long int get_nom() {return nom; } 
    long int get_denom() {return denom; } 
}; 

class List { 
    B* head; 
public: 
long int& operator [] (long int desired_denom) { 
     // here I search the node that containts the denom that is equal to desired_denom 
     // and insert it to tmp (it's a pointer to B). 
     long int a1 = tmp->get_nom() 
     long int& a2 = a1; 
     return a2; 
    } 
}; 
現在在 main

,我想做的事:

int main() { 
    A a; // assume that it creates the list of B and put values in each node (each B) 
    // here I want to do: 
    a[2] = 3; // it should search the node that his denom is equal to 2, and puts 3 instead of his nom 
    return 0; 
} 

例如:

如果我的名單是:

(nom=5, denom=6)->(nom=1,denom=8)->(nom=4, denom=2)->NULL 

a[2]=3搜索他的denom爲2節點行(這是第三點),並設置自己的NOM爲3

所以這行後,我的名單將是:

(nom=5, denom=6)->(nom=1,denom=8)->(nom=3, denom=2)->NULL 
+5

爲什麼你首先返回一個整數的引用?此外,返回一個本地自動變量的引用是UB。 – 2013-04-21 19:03:24

+5

@ H2CO3返回一個引用對於運算符[]' – 2013-04-21 19:04:41

+4

@DavidHeffernan是完全正常的,但不是對_local_變量的引用。 – 2013-04-21 19:05:37

回答

1

當前在您的代碼中沒有辦法以您想要的方式修改節點。 get_nom將不得不更改爲返回參考,然後才能按照您的方式行事。現在,您只能複製鏈接列表中每個節點的值。

假設TMP設置正確,你可以通過get_nom

long int& operator [] (long int i) { 
    //Get tmp here probably by list traversal 
    return tmp->get_nom(i); 
} 

然後的get_nom實施返回返回的引用。需要注意的是,nom必須是一個具有足夠長使用壽命的值,如下所述。返回nom對於類是私有的,因此函數返回時不會超出範圍。

long int& get_nom() {return nom; } 

get_nom必須返回long int&這個工作。返回long intlong int&之間有一個重要區別。當返回類型爲long int時,將返回所返回值的副本並將其傳遞給調用者。當您返回long int&或換句話說,通過引用返回一個long int時,引用指向存儲該值的內存中的位置。此引用允許您在存儲在數組中間或任何正在使用的數據類型中時更改long int的值。

這樣做的另一個重要副作用是,如果您返回對局部變量的引用,當變量超出範圍時,該值將不再存在於內存中。我還沒有真正嘗試編譯和運行,所以我不知道,如果編譯器會生氣或完全相同的結果會是什麼,但我知道它會不會好:

long int& operator [] (long int i) { 
    long int a = i + 5; //arbitrary change 
    return a; 
} 

在這種情況下,您正在返回對a位置的引用,但由於函數完成執行後超出範圍,引用不再指向任何內容。在函數退出後,您要返回參考的變量仍然存在。

+0

我有:p =「1/2x」,我正在嘗試:p [1] = 3(輸出應該是:「3/2x」 int [1](long int'1'),但它不會將'3'替換爲'1'。我該如何修復它? – 2013-04-21 19:36:15

+0

get_num是否返回'long int'或'long int&'?這兩者之間有一個重要的區別,我將在我的答案中詳細說明。 – Danny 2013-04-21 19:39:18

+0

get_num返回ns'long int'和我的操作符中我寫道:long int nom = getnom(i); long int&r_nom = nom;返回r_nom; – 2013-04-21 19:41:09

1

的編譯錯誤是此行

int& b = a; 
^^^^ 

應該

long int& b = a; 
^^^^^^^^ 

而且,正如朋友在評論中所說的那樣,返回對局部變量的引用會導致未定義的行爲,因爲引用的變量在退出函數後將被銷燬。

盲目傾向,如果get_num正確返回引用,則可能需要返回對get_num的引用。

return get_num(i); 
相關問題