【发布时间】:2012-11-27 06:29:22
【问题描述】:
我正在写一个轻松“打开”模式的课程,然后我有点困惑。在重载的 operator= 上从另一个类复制,访问私有 T 成员 m_Mode 被授予,为什么会发生这种情况?是标准问题,还是编译器错误?
template<class T>
class CFixedMode
{
private:
T m_Mode;
public:
CFixedMode()
{
m_Mode = static_cast<T>(0);
}
~CFixedMode(){}
void SetMode( T mode );
void SetNotMode( T mode );
BOOL IsMode( T mode );
CFixedMode<T>& operator=( const CFixedMode< T >& rFixedMode );
};
template<class T>void CFixedMode<T>::SetMode( T mode )
{
m_Mode |= mode;
}
template<class T>void CFixedMode<T>::SetNotMode( T mode )
{
m_Mode &= (~mode);
}
template<class T>BOOL CFixedMode<T>::IsMode( T mode )
{
return ( ( m_Mode & mode ) == mode ) ? TRUE : FALSE;
}
template<class T>CFixedMode<T>& CFixedMode<T>::operator =( const CFixedMode<T>& rFixedMode )
{
if( typeid( m_Mode ) == typeid( rFixedMode.m_Mode ) )
m_Mode = rFixedMode.m_Mode;
return *this;
}
int _tmain(int argc, _TCHAR* argv[])
{
CFixedMode<DWORD> Mode;
DWORD rMode = 0x00000010;
Mode.SetMode( rMode );
CFixedMode<DWORD> Mode2;
Mode2 = Mode;
if( Mode2.IsMode( 0x00000010 ) )
{
//cout << Mode2.m_Mode; //c2248
cout << "True" << endl;
}
typeid(Mode).before(typeid(CFixedMode<DWORD>));
return 0;
}
【问题讨论】:
-
你的
operator=只接受相同类型的 T,这意味着它是同一个类,因此可以访问私有成员。 -
那么整个
typeid的事情甚至没有必要?但那是标准的吧? -
正确,因为您只接受参数的相同模板实例化,
typeid比较应该始终为真。
标签: c++ templates private-members