2011-03-17 70 views

回答

5

你不能,因爲沒有可以使用的自動轉換。

請記住,你不能按值傳遞數組給一個函數:數組參數實際上只是一個指針參數,所以下面兩個是一樣的:

void f(long a[]); 
void f(long* a); 

當你傳遞一個數組一個函數,該數組隱式轉換爲指向其初始元素的指針。因此,鑑於long data[10];,下面兩個是相同的:

f(data); 
f(&data[0]); 

有從short*long*的隱式轉換,因此,如果data被宣佈爲short data[10];,你會得到一個編譯錯誤。

您將需要顯式轉換short*long*,使用reinterpret_cast,但不會轉化「N short元素的數組」到「N long元素的數組,」它會重新解釋指向的數據作爲「[某些數量的] long元素的數組」,這可能不是你想要的。

您需要創建long元素的新數組,並從short的數組中的元素複製到的long數組:

short data[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

long data_as_long[10]; 
std::copy(data, data + 10, data_as_long); 
f(data_as_long); 

或者,你可能會考慮改變你的函數是一個模板,可以接受一個指向任何類型的元素的數組:

template <typename T> void f(T*); 

或者,更先進的解決方案,最通用的方法,這樣做將有你的函數取一個迭代器範圍。這樣,你可以傳遞任何類型的迭代器(包括指向數組的指針)。另外,它提供了一種自然而簡單的方法來確保數組的長度正確傳遞,因爲長度不是顯式傳遞的,而是由參數決定的。

template <typename Iterator> void f(Iterator first, Iterator last); 

const unsigned length_of_data = 10; 
long data_array[length_of_data]; 
std::vector<long> data_vector(length_of_data); 

f(data_array, data_array + length_of_data); // works! 
f(data_vector.begin(), data_vector.end()); // also works! 
+1

對,這裏是一個證明http://ideone.com/kaHKp – UmmaGumma 2011-03-17 16:27:04

1

不,一個好的編譯器會給出錯誤。糟糕的編譯器會給出奇怪的結果。

重鑄一次一個單個元件是常見的,因此不會造成困難,但指針傳遞到期望一種類型的對象的功能和接收另一個是I Love Lucy排序災難。

+0

因此,我將不得不將每個值從短陣列複製到長陣列的相同的​​#元素? – Andrew 2011-03-17 16:23:34

+0

一個好的編譯器不會像這樣自動拋出數組;除其他事項外,因爲你所質疑的晦澀難懂。你必須手動完成。 – dialer 2011-03-17 16:24:59

+0

@aspiehier:是的,要麼通過複製生成一個正確類型的數組,要麼像另一個期望短褲一樣創建一個新函數,要麼可以根據額外的參數重新調整當前的一個函數來處理。 (這些大致按照最不理想的解決方案。) – wallyk 2011-03-17 16:31:14

相關問題