2013-01-11 93 views
1

我有一個類Sparse_Matrix,它允許我有效地使用稀疏矩陣。C++ MatLab構造函數重載

我想通過使用特定的(習慣)的關鍵字,例如上,身份等來實例化一個特定的矩陣

這是我的類聲明(命名空間矩陣)

template <typename T> 
class Sparse_Matrix 
{ 

    private: 
    int rows; 
    int cols; 
    std::vector<int> col; 
    std::vector<int> row; 
    std::vector<T> value; 
    ... 

是否有獲得預初始化對象的方法?

Sparse_Matrix<int> = Eye(3); 

將返回一個3乘3的單位矩陣。

我已經看過構造函數的成語,但那些需要一些與我的類不兼容的靜態類型的軟(儘管我願意接受建議)。

我自己也嘗試這樣的代碼:

template <typename T> 
Sparse_Matrix<T> Eye(int size) 
{ 
    Sparse_Matrix<T> ma; 
    ma.IdentityMatrix(size); 
    std::cout << "Eye!" << std::endl; 
    return ma; 
} 

...

Sparse_Matrix<int> blah = Eye(10); 

,但無濟於事。

謝謝

SunnyBoyNY

+1

什麼 「但無濟於事。」具體是指? – JaredC

+0

編譯器錯誤是:'沒有匹配的函數調用「Eye(int)」' – SunnyBoyNY

回答

2

在C++中只有一個地方可以根據表達式的使用方式推導出模板參數:用戶定義的轉換運算符。

struct Eye 
{ 
    int size; 
    explicit Eye(int requestedSize) : size(requestedSize) {} 

    template<typename T> 
    operator SparseMatrix<T>() const { SparseMatrix<T> ma; ma.IdentityMatrix(size); return ma; } 
}; 

現在你可以寫

Sparse_Matrix<int> blah = Eye(10); 
+0

看來我的GCC編譯器遇到一個錯誤:'錯誤:ISO C++禁止聲明'Eye'沒有類型'。和'錯誤:只有構造函數的聲明可以是顯式的'。 – SunnyBoyNY

+0

@SunnyBoyNY:那你拼錯了什麼。它編譯的很好 - http://ideone.com/C1CcUG(使用vector而不是'SparseMatrix',我沒有定義) –

+0

當然我犯了一個拼寫錯誤 - 我將結構重命名爲Eye2,但是在'explicit'語句之後不重命名眼睛。 – SunnyBoyNY

2

有了這樣的構造你的對象是一個很好的策略功能。在你的榜樣,一個解決方案是專門來告訴Eye類型:

Sparse_Matrix<int> blah = Eye<int>(10); 

有時,這些功能是在類中的靜態爲了清晰:

template<typename T> 
class Sparse_Matrix 
{ 
public: 
    static Sparse_Matrix<T> Eye(...) {...} 
}; 

在這種情況下,你會打電話:

Sparse_Matrix<int> blah = Sparse_Matrix<int>::Eye(10); 
+0

那麼,你實際上並不需要,你只需要添加一個可引用的上下文。 –

+0

@Ben我看到你的答案,有趣的... – JaredC

+0

@JaredC它看起來像我剛剛缺少構造函數<>。現在,爲什麼這些函數被聲明爲靜態的? – SunnyBoyNY