2012-02-24 61 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