2013-11-21 67 views
1

我是C++中絕對的初學者,所以我真的很感謝你的幫助!模板參數變量/動態實例化

我目前正在執行一個矩陣類與模板參數的數據類型,尺寸寬度和高度尺寸。

template <class T, int rows, int columns> class Matrix 

在乘法函數我要創建的結果矩陣(身高基質A x寬矩陣B),但我收到錯誤「模板值不能顯示在一個常量表達式」。

// overload * for matrix multiplication 
    template <class T, int rows, int columns> 
    Matrix<T, rows, columns> operator*(Matrix<T, rows, columns> a, Matrix<T, rows, columns> b) { 
    Matrix <T, rows, columns> result = new Matrix<T, a->height, b->width>; 
// make multiplication here 

任何想法如何使一個新的矩陣與給定的類型和從A的高度resp。寬度從B?

太謝謝你了!

+0

首先,您可能需要查看矩陣乘法規則。例如,(r1,c1)矩陣乘以(r2,c2)矩陣需要c1 == r2,並給出(r1,c2)結果。 –

回答

1

正如錯誤所述,您不能從動態(運行時間)值設置靜態(編譯時間)「字段」。

你可以(並不是說你應該)使用不同的模板參數的兩個矩陣的大小並創建一個新的矩陣與他們:

template <class T, int rows_A, int columns_A, int rows_B, int columns_B> 
Matrix<T, rows_A, columns_B> operator*(Matrix<T, rows_A, columns_A> a, Matrix<T, rows_B, columns_B> b) { 
    Matrix <T, rows_A, columns_B> result; 
    // ... 
    return result; 
} 

正如喬Z.說,你會也必須先檢查操作的有效性。因爲columns_A必須等於rows_B,所以可以分解兩個模板參數。

編輯:MMMMMMM寫了這個分解在下面的評論:

template <class T, int rows_A, int columns_A_rows_B, int columns_B> 
Matrix<T, rows_A, columns_B> operator*(
    Matrix<T, rows_A, columns_A_rows_B> a, 
    Matrix<T, columns_A_rows_B, columns_B> b 
) { 
    Matrix <T, rows_A, columns_B> result; 
    // ... 
    return result; 
} 

然而,這段代碼是不是真的很好看,也不方便使用。如果可以的話,您可以嘗試使尺寸變爲動態的思路(不是參數模板),正如Matt所建議的那樣。

+0

但矩陣大小沒有指定,所以它可以是任何數量的東西。有沒有什麼辦法可以創建一個沒有列/行參數的新矩陣?也許像模板專業化一樣,這可能是一個可能的解決方案嗎? – Patrick

+0

模板不是表達無限可能性的一種方式。他們在代碼上,但不在程序運行時。行和列的精確值在程序編譯期間定義。如果在編譯期間矩陣的大小不是「可定義的」,則應放棄使用模板的想法。另外,不要忘記T/rows/columns的每個組合都將使用您的模板生成一個新的唯一類定義。如果您矩陣的大小差別很大,模板可能會對您的應用程序有風險。 –

+0

我真的不知道你可以用模板專門化來做什麼,因爲你必須自己專門化每一個可能的T /行/列組合......巨大的代碼無非是證明模板不是一個理想的解決方案; ) –

1

如何化妝的行和列的構造函數的參數?

模板類矩陣

{
市民:
矩陣(INT行,詮釋列) {....}
}

//那麼你可以創建一個新的實例:

Matrix <T>* result = new Matrix<T> (a->height, b->width) 
+0

但我必須使用模板,有沒有其他方式通過使用模板? – Patrick

+0

@帕特里克我不認爲有另一種方式。模板實例化在編譯期間發生,而不是在運行期間發生,所以如果你傳遞一個變量,編譯器無法決定編譯時類型是什麼,這就是問題。 – Matt

-1

它看起來像在這一行:

Matrix <T, rows, columns> result = new Matrix<T, a->height, b->width>; 

是錯誤。您正在嘗試將新的Address寫入棧中聲明的變量。指的是你的模板類矩陣存儲矩陣和*運算符,它是一個模板方法的數據時

Matrix<T, int, int> *result = new Matrix<T, a->height, b->width>(); 
+0

不幸的是,它不起作用,g ++編譯器說: matrix.h:68:23:錯誤:類型/值在模板參數列表中的參數2不匹配模板<類T,int行,int列>類矩陣' Matrix * result = new Matrix height,b-> width>(); – Patrick

+0

現在我明白了,那是我的錯。如果有人試圖運行此代碼:請不要這樣做。 @Patrick感謝您的信息。應該是:Matrix * result = new Matrix (a-> height,b-> width); – marcinioski

1

儘量想兩個不同的概念: 試試這個。

如果將*運算符看作乘法模板類的模板方法,那麼您意識到需要更多的模板參數,並且這些參數僅由矩陣類的一個實例給出。

給出的錯誤是因爲a-> width和a-> height在編譯時不知道,編譯時必須知道每個模板參數。