2011-10-06 2 views
0

어떤 이유로 든 ErrorHandler.h에서 다음 오류가 계속 발생합니다. 크기 함수에 인수가 누락 된 이유는 무엇입니까?std 목록의 오류

'std :: list < _Ty> :: size': 함수 호출 누락 인수 목록; 마지막 요소를 반환하지 않는 회원

'std::_List_iterator<_Mylist> std::list<_Ty>::erase(std::_List_const_iterator<_Mylist>,std::_List_const_iterator<_Mylist>)' : cannot convert parameter 1 from 'int' to 'std::_List_const_iterator<_Mylist>' 

    'std::_List_iterator<_Mylist> std::list<_Ty>::erase(std::_List_const_iterator<_Mylist>)' : cannot convert parameter 1 from 'int' to 'std::_List_const_iterator<_Mylist>' 


// in errorhandler.h 

    class ErrorHandler{ 
     std::list<unsigned int> m_ErrorList; 
    public: 
     ErrorHandler(){ } 
     ~ErrorHandler(){ } 
     void ForceShutdown(){ free(&m_ErrorList); } 
     void Add(int errCode){ m_ErrorList.push_back(errCode); } 
     unsigned int GetLastError(){ if(m_ErrorList.size!=0)return m_ErrorList.back(); } 
     void Remove(int pos){ if(m_ErrorList.size!=0)m_ErrorList.erase(pos); } 
     void RemoveRange(int start,int end){ if(m_ErrorList.size!=0)m_ErrorList.erase(start,end); } 

    }; 


// in criticalsection.h 
    class CriticalSection{ 
     long m_nLockCount; 
     long m_nThreadId; 
     typedef CRITICAL_SECTION cs; 
     cs m_tCS; 
    public: 
     CriticalSection(){ 
      ::InitializeCriticalSection(&m_tCS); 
      m_nLockCount = 0; 
      m_nThreadId = 0; 
     } 
     ~CriticalSection(){ ::DeleteCriticalSection(&m_tCS); } 
     void Enter(){ ::EnterCriticalSection(&m_tCS); } 
     void Leave(){ ::LeaveCriticalSection(&m_tCS); } 
     void Try(); 
    }; 
    class LockSection{ 
     CriticalSection* m_pCS; 
     ErrorHandler * m_pErrorHandler; 
    public: 
     LockSection(CriticalSection* pCS,ErrorHandler* pErrorHandler){ 
      m_pCS = pCS; 
      m_pErrorHandler = pErrorHandler; 
      if(!m_pCS)m_pErrorHandler->Add(0x1AE1); // 0x1AE is code prefix for critical section header 
      if(m_pCS)m_pCS->Enter(); 
     } 
     ~LockSection(){ 
      if(!m_pCS)m_pErrorHandler->Add(0x1AE2); 
      if(m_pCS)m_pCS->Leave(); 
     } 
    }; 

답변

1


아니, pop_back에 대한 포인터를 만드는 '& 표준 : : 목록 < _Ty> :: 크기'를 사용합니다. 실수로 인한 오류를 방지하기위한 것입니다. back()을 통해 마지막 요소를 명시 적으로 가져와야합니다. 이 방법은 여러 개를 읽지 않고 팝업하려는 경우 더 빠릅니다. 이것은 다른 모든 표준 C++ 라이브러리 컨테이너에도 적용됩니다.

경고로 판단해도 삭제하는 데 문제가있는 것으로 보입니다. 리스트의 경우는 까다로운 일이 될 수 있습니다

void Remove(int pos){ 
    std::list<unsigned int>::const_iterator iter = m_ErrorList.begin(); 
    //no need to check the size, advance will throw an exception if pos is invalid 
    std::advance(iter, pos); 
    m_ErrorList.erase(iter); 
} 
+2

'pop_back()'은 마지막 요소를 반환하지 않습니다. 왜냐하면 비효율적 일 수있는 값으로 수행해야하기 때문입니다. C++ 11의 이동 구조는 이것을 표면 상으로 해결할지라도. –

+1

@JonPurdy : 효율성 만이 아닙니다. 그것은 예외의 정확성에 관한 것입니다. 팝 된 객체를 반환하는 pop은 복사 ctor가 예외를 throw하면 객체를 잃게됩니다. –

+0

@JerryCoffin : 고려해야 할 또 다른 좋은 점. 하지만, 왜 복사 생성자가 첫 번째 장소에 던져 넣을 지에 대해서는 조금 더 관련이 있습니다. –

0

당신은 심하게 목록 방법을 사용하십시오

if(m_ErrorList.size!=0) 

size이 방법, 당신은 (괄호)를 호출 할 필요가 있도록 :

if(m_ErrorList.size()!=0) 

의 경우 size이 느립니다. 이 같은 GetLastError를 구현할 수 있습니다 :

unsigned int GetLastError(){ if(!m_ErrorList.empty())return m_ErrorList.back(); } 

m_ErrorList.erase(pos); 

삭제는 반복자가 아닌 정수를합니다. 따라서 더 나은 사용을 원할 것입니다.

std::list::iterator it=m_ErrorList.begin(); 
std::advance(it, pos); 
m_ErrorList.erase(it); 

이는 특히 효율적인 방법은 아닙니다.

동의어 : list; vector가 도움이 될 수 있습니다.

+1

'std :: list :: iterator'는'operator +'를 오버로드한다고 생각하지 않습니다. 나는 그가'std :: advance'를 사용해야한다고 생각한다. –

+1

@MooingDuck : true. 이것은 서투른 결과를 더욱 분명하게 만듭니다. – jpalecek

관련 문제