2009-09-14 79 views
0

我正在構建矩陣模板。有運營商,功能和一切工作正常。除非我嘗試將一個double類型的矩陣轉換爲int類型的矩陣(反之亦然)。 =運算符不能被定義,所以它不可能在類外部對basic_Matrix2D和basic_Matrix2D進行覆蓋。我知道我可以在class =運算符中編寫來轉換,但在這種情況下,會有兩個=運算符具有相同的參數。使用double作爲模板參數時,從double轉換將與從template參數轉換相同。類定義如下,代碼可以從SourceForge模板類型轉換

template <class _T> class basic_Matrix2D { 

} 

訪問還有我想起了模板,轉換爲模板類型的指針作品,而轉換爲模板類型另一個問題沒有。這可能是編譯器特定的。觀察:提前

operator _T() { 
    return something; 
} 

operator _T*() { 
    return somethingelse; 
} 

感謝,
傑姆

+0

看CRTP http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern - 這可能提供一種解決方案 – slashmais 2009-09-14 20:04:19

+0

Thx,這提供了一個想法。我可以從basic_Matrix2D派生基本矩陣類型(double和int)以添加重載操作符。我應該想到,我想我需要更多的咖啡因 – 2009-09-14 20:23:57

+3

請注意,標識符以下劃線開頭並以大寫字母開頭並保留用於實施。這意味着你不能使用'_T'。 (實際上,這可能意味着一些宏'_T'踐踏你的代碼並導致很多奇怪的錯誤信息。)所有標識符都包含相同的下劃線和全局名稱空間中以下劃線開始的所有標識符。如果這太記住了,只需按照常見的建議來避免所有以下劃線開頭或包含兩個連續的下劃線的標識符。 – sbi 2009-09-14 20:58:00

回答

4

你的問題很清楚,但那裏有沒有錯,使得運營商=是這樣的:

// incomplete, but you get the idea 
template<class U> 
basic_Matrix2D<T> & operator=(const basic_Matrix2D<U> &x) 
{ 
    rows = x.rows; 
    cols = x.cols; 
    data = new T[rows * cols]; 
    for (size_t i = 0; i < rows * cols; ++i) 
     data[i] = x.data[i]; 
} 

這將允許你從表達式T t; t = U();良好形成的任何矩陣中分配。如果你不能,它將無法編譯。您還可以包含一個簡單的basic_Matrix2D<T> & operator=(const basic_Matrix2D<T> &);賦值操作符 - 也許您可以獲得一些額外的效率或其他功能。

+0

Thx爲明確答案,這就是我正在尋找的。 – 2009-09-14 22:53:23

1

我想會不會是不尋常提供一個「轉換構造」:

template <class U> 
Matrix2D<T>(const Matrix2D<U>&) 

這應該自動使一切工作,如

Matrix2D<double> a; 
Matrix2D<int> b; 
//implicitly uses the conversion constructor to create a temporary Matrix2D<double> from b 
a += b; 

即使當使臨時對象會太貴了,你可以定義所有的操作符,以便操作數可以是不同類型的矩陣。

然而,轉換運營商是一個死路一條。他們只是渾水。

P.S我也看了一下你項目的參考資料。重新創建鏈表的目的是什麼,特別是如果它的接口與SC++ L完全不兼容? (即使像wxWidgets的一個古老的圖書館提供了一個可供選擇和優先STL兼容的接口,能夠滿足wxString。)


編輯:關於你提到的轉換操作符的問題,是不是與編譯它的編譯器?

template <class T> 
struct X 
{ 
    int n; 

    operator T() { return n; } 
    operator T*() { return &n; } 
}; 

int main() 
{ 
    X<int> x = {42}; 
    int a = x; 
    int* b = x; 
} 

請注意,這可能被認爲是濫用操作符重載,這絕對不會使您的代碼更清潔。

+0

Thx爲答案。對於鏈表來說,它實際上是一個排序鏈接列表(插入排序),我需要另一個速度至關重要的項目,只是爲了懶惰而導入。對於STL兼容性,我確實感到內疚,但在列表已被排序的情況下無法實現排序功能,因此在繼續兼容性方面沒有意義。 – 2009-09-14 22:40:46

+0

對於轉換,我使用VC++ 8.0的內部編譯器我也有權訪問g ++,我還沒有檢查。它實際上給出了一個有趣的錯誤:'operator {'不是一個公認的操作符或類型。實際上,兩個轉換(T *和T)不在同一個類中。 – 2009-09-14 22:41:28