'전환'모드를 쉽게 켜고 끌 수있는 클래스를 작성 했으므로 조금 혼란 스럽습니다. 오버로드 된 연산자 = 다른 클래스에서 복사하려면 T
구성원 m_Mode
에 대한 액세스 권한이 부여됩니다. 왜 이런 일이 발생합니까? 그것 sandard, 또는 아마도 컴파일러 버그? 이 인스턴스 클래스의에하지의 클래스에 개인의클래스 참조가 전용 멤버에 대한 액세스 권한을 부여합니다.
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;
}
'연산자 ='는 T와 동일한 유형 만 허용합니다. 즉, 동일한 클래스이므로 private 멤버에 대한 액세스 가능성이 있습니다. – chris
그래서'typeid' 전체가 필요하지 않습니다. 그렇다면 그것은 표준의 권리입니까? –
매개 변수에 대해 동일한 템플리트 인스턴스화 만 수락하므로'typeid' 비교가 항상 참이어야합니다. – chris