运算符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;
}
};