2012-02-16 64 views
3

我正在嘗試編寫我自己的氣泡排序算法作爲練習。我不明白這兩個錯誤信息。任何人都可以用我的代碼指出問題嗎?重載函數沒有上下文類型信息|無法解析基於轉換類型'int'的重載函數'swap'

// Bubble sort algorithm 
#include <iostream> 
#include <iomanip> 
using namespace std; 

void bubbleSort(int array[], int arraySize); // bubbleSort prototype 

int main(void) 
{ 
     const int arraySize = 10; 
     int array[arraySize] = {2,3,6,5,7,8,9,3,7,4}; 

     cout << "Unsorted: "; 
     for(int i = 0; i < arraySize; ++i) 
       cout << setw(5) << array[i]; 

     cout << "Sorted: " << bubbleSort(array, arraySize); 
} 

void bubbleSort(int array[], int arraySize) 
{ 
     const int max = arraySize; 
     int swap = 0; 

     for(int i = 0; i < max; ++i) 
     { 
       if(array[i] > array[i + 1]) 
       { 
         swap = array[i + 1]; 
         array[i + 1] = array[i]; 
         array[i] = swap; 
       } 
       else 
         break; 
     } 
} 
+0

錯誤信息在哪裏? – iammilind 2012-02-16 03:02:39

+0

對不起:根據轉換鍵入「詮釋」 – 2012-02-16 03:03:52

+1

他想見的行號,編譯器錯誤給 缺少上下文信息 重載函數無法解析重載函數「交換」。 – 2012-02-16 03:06:18

回答

4

我看到你正在使用

using namespace std; 

所以,當你鍵入

array[i] = swap; 

編譯器不能消除歧義無論您是指std::swap功能或您int swap變量。實際上,它看起來像是假定您指的是該功能,並嘗試以某種方式將其轉換爲int。嘗試將你的變量重命名爲別的東西。

一般情況下,嘗試從using指令走就走,以避免名稱衝突這樣的。

1
cout << "Sorted: " << bubbleSort(array, arraySize); 

函數的返回類型是void。沒有什麼可以打印的。如果您需要打印排序後的數組,則需要在函數調用後迭代數組元素。

2
array[i] = swap; 

此行正在引發問題。這是更好地改變swap局部變量的名稱,已經存在一個相同名稱的功能,它是由線using namespace std;這是要避免的,反正納入範圍std命名空間。

我也建議你聲明的變量中,如果塊地方是實際上內部使用:

if(array[i] > array[i + 1]) 
{ 
    //declare temp here where it is actually used! 
    int temp = array[i + 1]; 
    array[i + 1] = array[i]; 
    array[i] = temp; 
} 

最佳實踐:通過延遲其申報減少範圍的局部變量,這意味着聲明他們在哪裏實際使用。不要在函數的開頭聲明它們。

另一種方式來修復代碼中的問題是,你可以通過做這個給編譯器上下文雖然我不建議這個解決方案,它只是讓你知道):

array[i] = (int)swap; //giving compiler contextual type information 

當你施放swapint,編譯器可以知道swap指的是局部變量,而不是它在std命名空間中定義的功能。

+1

哦......我不知道「上下文類型信息」,它可以像這樣明確給出。 – iammilind 2012-02-16 03:33:42

+0

@iammilind:它很常見,當你重載函數,那麼你提到的功能*類型*,無論是顯式轉換,或作爲目標類型。比如說,在你的項目中有很多名字爲'f'的重載函數,那麼'auto x = f'會出現編譯錯誤,說明模糊的函數名稱。要解決這個問題,你要麼寫'ftype x = f',要麼'auto x =(ftype)f',其中'ftype'是你打算使用的函數的類型。 – Nawaz 2012-02-16 06:43:58

相關問題