2011-10-06 30 views
0

出於某種原因,我不斷收到在ErrorHandler.h 以下錯誤,爲什麼大小功能缺失的參數?錯誤性病列表

'的std ::名單< _Ty> ::大小':函數調用缺少參數列表;使用 '&的std ::列表< _Ty> ::大小' 來創建一個指針成員

'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不返回的最後一個元素。這是爲了防止意外錯誤。你必須通過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:這不僅僅是效率,這是關於異常的正確性。如果複製ctor拋出異常,則返回正在彈出的對象的pop將丟失該對象。 –

+0

@JerryCoffin:另一件值得考慮的好事。雖然,爲什麼複製構造函數首先會拋出更多的關注。 –

0

您使用列表方法嚴重:

if(m_ErrorList.size!=0) 

size是一個方法,所以你需要調用它(帶括號):

if(m_ErrorList.size()!=0) 

請注意sizelist慢;您可能要實現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); 

請注意,這也不是一個特別有效的方法。

BTW,檢查你需要list;一個vector可能會更好地爲您服務。

+1

我不認爲'std :: list :: iterator'重載'operator +'。我認爲他必須使用'std :: advance' –

+1

@MooingDuck:true。這使得笨拙更加明顯。 – jpalecek