2015-01-12 16 views
0

函數的參數int&如何處理int**類型的變量?如何爲一個帶參數int&的函數處理一個int **類型的變量?

例如,我有常規的交換功能,它在我從一個指針數組傳遞變量時起作用。它如何不會導致類型不匹配錯誤?因爲互換應該只收到int而不是int**

void swap(int& a, int& b); 
const int SIZE = 6; 
int main(){ 

    int arr[SIZE] = { 1, 2, 3, 4, 5, 6 }; 
    int*pointers[SIZE]; 

    int i; 
    for (i = 0; i<SIZE; i++) 
     pointers[i] = &arr[i]; 
    for (i = 0; i < SIZE; i++) 
     swap(pointers[i], pointers[i + 1]); 
} 


void swap(int& a, int& b){ 
    int t; 
    t = a; 
    a = b; 
    b = t; 
} 
+2

請發佈一個MCVE。 – juanchopanza

+0

請告訴我們調用'swap()'的代碼。 – Kevin

+1

無論如何,你知道'std :: swap'嗎?另外,作爲參考的校正標籤顯然不* C。 – Deduplicator

回答

2

已經有一個功能叫做swap標準,它生活在namespace std和一切被定義爲:

// simplification 
namespace std { 
    template <typename T> 
    void swap(T&, T&) { .. } 
} 

您在不同的提供自己的版本,因爲它是這並不衝突命名空間(而不是一個模板):

void swap(int&, int&) { .. } 

通常情況下,就沒有爭用和正在發生的事情是很明顯的:

swap(i1, i2);      // fine, calls yours 
std::swap(c1, c2);     // fine, calls std::swap<char> 
swap(c1, c2);      // error: can't convert char to int& 
swap(pointers[i], pointers[i+1]); // error: can't convert int* to int& 

但地方在你的代碼,您有:

using namespace std; 

這使在std::swap到全局命名空間 - 現在您swap只是充當一個超載 - 其中之一是首選int&

swap(i1, i2);      // fine, calls yours 
swap(c1, c2);      // fine, calls std::swap<char> 
swap(pointers[i], pointers[i+1]); // fine, calls std::swap<int*> 

這就是它工作的原因。這並不是說你不知何故允許int*轉換爲int& - 這是你默默地調用一個完全不同的功能,而不是你認爲的那個功能。故事的道德:避免using namespace std; - 它會讓你的代碼做得更清晰。

相關問題