2013-08-22 3 views
1

У меня эти классы в моей библиотеке.Класс шаблона с компиляцией CRITICAL_SECTION, но при использовании его получил ошибку

class SingleLock 
{ 
public: 
    SingleLock(CRITICAL_SECTION *pCS); 
    ~SingleLock(); 

private: 
    LPCRITICAL_SECTION m_cs; 
}; 

SingleLock::SingleLock(CRITICAL_SECTION *pCS) 
{ 
    m_cs = pCS; 
    EnterCriticalSection(m_cs); 
} 
SingleLock::~SingleLock() 
{ 
    LeaveCriticalSection(m_cs); 
} 

template <typename T> 
class Callback 
{ 
public: 
    Callback() : m_current(), m_total(), m_cs() 
    { 
     InitializeCriticalSection(&m_cs); 
    } 

~Callback() 
{ 
    DeleteCriticalSection(&m_cs); 
} 

void SetCurrent(T current) 
{ 
    SingleLock(&m_cs); 
    m_current = current; 
} 

void SetTotal(T total) 
{ 
    SingleLock(&m_cs); 
    m_total = total; 
} 

T GetCurrent() 
{ 
    SingleLock(&m_cs); 
    return m_current; 
} 

T GetTotal() 
{ 
    SingleLock(&m_cs); 
    return m_total; 
} 

private: 
    T m_total; 
    T m_current; 
    CRITICAL_SECTION m_cs; 
}; 

The Callback класс компилируется, но в то время как попытаться использовать какой-либо метод в коде, мой код не компилируется. Я изменил его на это:

template <typename T> 
class Callback 
{ 
public: 
    Callback() : m_current(0), m_total(0), m_cs() 
    { 
     InitializeCriticalSection(&m_cs); 
    } 

    ~Callback() 
    { 
     DeleteCriticalSection(&m_cs); 
    } 

    void SetCurrent(T current) 
    { 
     EnterCriticalSection(&m_cs); 
     m_current = current; 
     LeaveCriticalSection(&m_cs); 
    } 

    void SetTotal(T total) 
    { 
     EnterCriticalSection(&m_cs); 
     m_total = total; 
     LeaveCriticalSection(&m_cs); 
    } 

    T GetCurrent() 
    { 
     EnterCriticalSection(&m_cs); 
     T result = m_current; 
     LeaveCriticalSection(&m_cs); 
     return result; 
    } 

    T GetTotal() 
    { 
     EnterCriticalSection(&m_cs); 
     T result = m_total; 
     LeaveCriticalSection(&m_cs); 
     return result; 
    } 

private: 
    T m_total; 
    T m_current; 
    CRITICAL_SECTION m_cs; 
}; 

И теперь все работает, может кто-нибудь объяснить, почему это происходит?

ответ

1

не рад этому, но после размещения вопрос сразу нашли ошибку, мне нужно SingleLock sl(&m_cs); вместо SingleLock(&m_cs);

+0

Причина в том, что 'SingleLock (&m_cs);' создает * временный * экземпляр, который немедленно уничтожен. Объявление переменной сохраняет эту переменную в области действия до тех пор, пока функция не вернется, когда она будет уничтожена. –