Ошибки со стандартным списком - PullRequest
0 голосов
/ 07 октября 2011

По какой-то причине я продолжаю получать следующие ошибки в ErrorHandler.h, почему функция размера пропускает аргументы?

'std :: list <_Ty> :: size': вызов функции отсутствует список аргументов;используйте '& 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();
        }
    };

Ответы [ 2 ]

1 голос
/ 07 октября 2011

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);
}
0 голосов
/ 07 октября 2011

Вы плохо используете методы списка:

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);

обратите внимание, что это тоже не особо эффективный способ.

Кстати, проверьте, что вам нужно list; vector может служить вам лучше.

...