std列表错误

Errors with std list

本文关键字:错误 列表 std      更新时间:2023-10-16

由于某些原因,我在ErrorHandler.h中不断收到以下错误为什么size函数缺少参数?

'std::list&lt_Ty>::size':函数调用缺少参数列表;使用'&std::list&lt_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();
        }
    };

http://www.cplusplus.com/reference/stl/list/pop_back/
否,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);
}

您糟糕地使用了列表方法:

if(m_ErrorList.size!=0)

size是一个方法,因此需要调用它(带括号(:

if(m_ErrorList.size()!=0)

注意,size对于list是慢的;你可能想要实现这样的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,检查您是否需要listvector可能会更好地为您服务。