2012-02-24 73 views
0

所以我在使用模板時遇到了重載賦值操作符的問題。基本上,我正在使用一個自定義的可調整大小的數組類,並且這是由不能調整大小的不同數組類繼承的。無論如何,我有兩個相等運算符,一個用於處理相同大小的數組,另一個用於處理不同大小的數組,只要類型相同。使用模板重載操作符

下面是運營商代碼:

// operator = 
// 
template <typename T, size_t N> 
const Fixed_Array <T, N> & Fixed_Array <T, N>::operator = (const Fixed_Array <T, N> & rhs) 
{ 
    for(size_t x = 0; x < N; x++) 
    { 
     this->set(x, rhs[x]); 
    } 
    return *this; 
} 

// 
// operator = 
// 
template <typename T, size_t N> 
template <size_t M> 
const Fixed_Array <T, N> & Fixed_Array <T, N>::operator = (const Fixed_Array <T, M> & rhs) 
{ 
    this->resize(M); 
    for(size_t x = 0; x < M; x++) 
    { 
     this->set(x, rhs[x]); 
    } 
    return *this; 
} 

而且這裏是我用來創建和分配什麼:

Fixed_Array<char, 10> * fa1 = new Fixed_Array<char, 10>(); 
    Fixed_Array<char, 20> * fa2 = new Fixed_Array<char, 20>(); 
fa1 = fa1; //works 
fa1 = fa2; //causes compiler to freak out 

錯誤消息主要是說,我不能這樣做10和20;它並沒有使用模板來獲取我的第二個賦值運算符。

有什麼建議嗎?

+1

我看不出有什麼理由不應該在'Fixed_Array fa1;'(和'fa2'類似)。那麼你可以使用'fa1 = fa2'。就像'int':你不會做'int * p = new int';'沒有*很好的理由,你只會使用'int i;'。 – 2012-02-24 03:46:46

回答

2

您正在分配一個指針而不是對象(導致內存泄漏作爲副作用!)。指針是不同類型的(<char,10><char,20>),所以編譯器會抱怨它。

operator =簽名似乎是正確的,用於分配的語法應爲:

*fa1 = *fa2; // ok (no memory leak) 
+0

好的!謝謝一堆! – craya1982 2012-02-24 03:16:20

0

你是如何調用是應該有固定大小的一類resize?這不會破壞事情嗎?

例如,

Fixed_Array<char, 10> little1; 
Fixed_Array<char, 20> big1, big2; 

big1 = little1; 
/* now big1 has size 10, because it was resized */ 
big1 = big2; /* tries to store 20 elements into a buffer of size 10 */ 

這將破壞堆(正式掛牌,這是不確定的行爲)。

+0

+1爲有效和必要的觀察,OP是餅乾。 – Puppy 2012-02-24 03:56:21