首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

运算符operator++重定义?该怎么处理

2012-03-29 
运算符operator++重定义?代码如下:#includeiostreamusingnamespacestdtemplatetypenameT,TUBound,TLBo

运算符operator++重定义?
代码如下:
#include   <iostream>
using   namespace   std;

template   <   typename   T,   T   UBound,   T   LBound   =   T()   >
class   BoundedNum
{
static   T   UpBound;
static   T   LowBound;
static   void   Clip(   T&   value   ){  
T   dist   =   UpBound   -   LowBound;
while   (value   >   UpBound)  
value   =   UpBound;
while   (value   <   LowBound)
value   =   LowBound;
}
TCurrent;
public:
explicit   BoundedNum():   Current(LowBound){}
BoundedNum(   T   value   ){
Clip(   value   );
Current   =   value;
}
BoundedNum&   operator   +=   (   T   v   )   {   Current   +=   v;   Clip(   Current   );   return   *this;   }
BoundedNum&   operator   -=   (   T   v   )   {   Current   -=   v;   Clip(   Current   );   return   *this;   }
BoundedNum&   operator   *=   (   T   v   )   {   Current   *=   v;   Clip(   Current   );   return   *this;   }
BoundedNum&   operator   /=   (   T   v   )   {   Current   /=   v;   Clip(   Current   );   return   *this;   }
operator   T(){   return   Current;   }
//friend   T   operator   +   (   T   v,   CycNum   cn   )   {   return   v   +   cn.Current;   }
friend   BoundedNum   operator   +(   BoundedNum   cn,   T   v   )   {   return   BoundedNum(   cn.Current   +   v   );   }
friend   BoundedNum   operator   -(   BoundedNum   cn,   T   v   )   {   return   BoundedNum(   cn.Current   -   v   );   }
friend   BoundedNum   operator   *(   BoundedNum   cn,   T   v   )   {   return   BoundedNum(   cn.Current   *   v   );   }
friend   BoundedNum   operator   /(   BoundedNum   cn,   T   v   )   {   return   BoundedNum(   cn.Current   /   v   );   }

template <   int   u,   int   l   >
friend   int   operator++(   BoundedNum <   int,   u,   l   > &   cn   )
{
++cn.Current;
if(   cn.Current   >   cn.UpBound   )   cn.Current   =   cn.UpBound;
return   cn.Current;
}

template <   int   u,   int   l   >
friend   int   operator++(   BoundedNum <   int,   u,   l   > &   cn,   int)
{
int   ret   =   cn.Current;
++cn;
return   ret;
}

template <   int   u,   int   l   >
friend   int   operator--(   BoundedNum <   int,   u,   l   > &   cn   )
{
--cn.Current;
if(   cn.Current   <   cn.LowBound   )   cn.Current   =   cn.LowBound;
return   cn.Current;
}

template <   int   u,   int   l   >


friend   int   operator--(   BoundedNum <   int,   u,   l   > &   cn,   int)
{
int   ret   =   cn.Current;
--cn;
return   ret;
}
};
template   <   typename   T,   T   UBound,   T   LBound   >  
T   BoundedNum <T,   UBound,   LBound> ::LowBound   =   LBound;

template   <   typename   T,   T   UBound,   T   LBound   >
T   BoundedNum <T,   UBound,   LBound> ::UpBound   =   UBound;

int   _tmain(int   argc,   _TCHAR*   argv[])
{
BoundedNum <int,   255>   a;
BoundedNum <int,   200>   b;//这里出现operator++重定义错误

cout   < <   a   +   b     < <   endl;
return   0;
}

为什么会出现重定义错误?

[解决办法]
你为什么要自找麻烦地用friend版本来实现++/--,用成员版本。
[解决办法]
template < typename T, T UBound, T LBound = T() >
class BoundedNum
{
static T UpBound;
static T LowBound;
static void Clip( T& value ){
T dist = UpBound - LowBound;
while (value > UpBound)
value = UpBound;
while (value < LowBound)
value = LowBound;
}
TCurrent;
public:
explicit BoundedNum(): Current(LowBound){}
BoundedNum( T value ){
Clip( value );
Current = value;
}
BoundedNum& operator += ( T v ) { Current += v; Clip( Current ); return *this; }
BoundedNum& operator -= ( T v ) { Current -= v; Clip( Current ); return *this; }
BoundedNum& operator *= ( T v ) { Current *= v; Clip( Current ); return *this; }
BoundedNum& operator /= ( T v ) { Current /= v; Clip( Current ); return *this; }
operator T(){ return Current; }
//friend T operator + ( T v, CycNum cn ) { return v + cn.Current; }
BoundedNum operator +(T v ) { return BoundedNum( Current + v ); }
BoundedNum operator -(T v ) { return BoundedNum( Current - v ); }
BoundedNum operator *(T v ) { return BoundedNum( Current * v ); }
BoundedNum operator /(T v ) { return BoundedNum( Current / v ); }

template < int u, int l >
int operator++( )
{
++Current;
if( Current > UpBound ) Current = UpBound;
return Current;
}

template < int u, int l >
int operator++( int)
{
int ret = Current;
++Current;
return ret;
}

template < int u, int l >
int operator--( )
{
--Current;
if( Current < LowBound ) Current = LowBound;
return Current;
}

template < int u, int l >
int operator--( int)
{
int ret = Current;
--Current;
return ret;
}
};

热点排行