2016-03-01 33 views
0

我擁有類格拉夫構造:[n]和INT **

template <typename T> 
Graph<T>::Graph(T ** input) 
{ 
    graphData = input; 
} 

當我試圖使用箱二維陣列,而不是這個類的一個新實例INT **

int intArray[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; 
Graph<int>* IntGraph = new Graph<int>(intArray); 

我有一個錯誤cannot convert parameter 1 from 'int [3][3]' to 'int **

我是新來的C++,我認爲這些類型兼容。你能否描述我的區別?

編輯: 因爲這個問題被標記爲重複的,我也想問,什麼是這些類型中的一種轉換成另一種最好的方式,或者改用什麼沒有任何性能損失

+5

見http://stackoverflow.com/questions/14183546/why-does-int-decay-into-int-but-not-int – Michael

+0

謝謝你,我現在理解上的差異。但是,我沒有找到方法,如何將一個轉換爲另一個。 –

+0

你想在這裏做什麼看起來危險和複雜。我可以看到有人將一個指向本地對象的指針傳入構造函數中的未定義行爲。幫你一個忙,並在Graph中使用'std :: vector'。 –

回答

2

int [3][3]在極少數例外情況下(例如用於sizeof運算符時)轉換爲int (*)[3]

int (*)[3]是指向int[3]類型的數組雖然int **是指針類型的對象int *

請看下面的例子

int a[3][3]; 
int (*pa)[3] = a; 

int * b[3]; 
int **pb = b; 

或最後聲明中,您可以編寫

int * (*pb) = b; 

在這個例子中,指針pa是初始值用二維數組a的第一個元素的地址化。二維數組的元素是一維數組。

指針pb也通過數組b中第一個元素的地址進行初始化。該數組的元素是int *類型的對象。

您不能將其中一種類型轉換爲另一種類型。

0

您不能將int [] []轉換爲int **,因爲在您的大小爲2 * 3的情況下,int [] []是一個連續的內存塊,而int **期望指向指向int 。

AFIK。你可以這樣做:

void myfunc(int myarray[][3]); 
相關問題